Jeśli masz tylko dwie opcje do wyboru:
df['color'] = np.where(df['Set']=='Z', 'green', 'red')
Na przykład,
import pandas as pd
import numpy as np
df = pd.DataFrame({'Type':list('ABBC'), 'Set':list('ZZXY')})
df['color'] = np.where(df['Set']=='Z', 'green', 'red')
print(df)
daje
Set Type color
0 Z A green
1 Z B green
2 X B red
3 Y C red
Jeśli masz więcej niż dwa warunki, użyjnp.select
. Na przykład, jeśli chcesz color
być
yellow
kiedy (df['Set'] == 'Z') & (df['Type'] == 'A')
- w przeciwnym razie
blue
kiedy(df['Set'] == 'Z') & (df['Type'] == 'B')
- w przeciwnym razie
purple
kiedy(df['Type'] == 'B')
- w przeciwnym razie
black
,
następnie użyj
df = pd.DataFrame({'Type':list('ABBC'), 'Set':list('ZZXY')})
conditions = [
(df['Set'] == 'Z') & (df['Type'] == 'A'),
(df['Set'] == 'Z') & (df['Type'] == 'B'),
(df['Type'] == 'B')]
choices = ['yellow', 'blue', 'purple']
df['color'] = np.select(conditions, choices, default='black')
print(df)
co daje
Set Type color
0 Z A yellow
1 Z B blue
2 X B purple
3 Y C black
df['foo'] = np.where(df['Set']=='Z', df['Set'], df['Type'].shift(1))
Zrozumienie listy jest innym sposobem warunkowego utworzenia kolejnej kolumny. Jeśli pracujesz z typami obiektów w kolumnach, tak jak w twoim przykładzie, wyliczenia list zwykle przewyższają większość innych metod.
Przykładowe zrozumienie listy:
Testy% czasu:
źródło
pd.DataFrame({'Type':list('ABBC')*100000, 'Set':list('ZZXY')*100000})
-size)numpy.where
wyprzedzamap
, ale lista jest królem (około 50% szybciej niżnumpy.where
).df['color'] = ['red' if (x['Set'] == 'Z') & (x['Type'] == 'B') else 'green' for x in df]
df['color_type'] = np.where(df['Set']=='Z', 'green', df['Type'])
.iterrows()
notorycznie jest powolny i DataFrame nie powinien być modyfikowany podczas iteracji.Innym sposobem, w jaki można to osiągnąć, jest
źródło
Oto jeszcze jeden sposób na skórowanie tego kota, używając słownika do mapowania nowych wartości na klucze na liście:
Jak to wygląda:
To podejście może być bardzo skuteczne, gdy trzeba wykonać wiele
ifelse
instrukcji typu (tj. Wiele unikalnych wartości do zastąpienia).I oczywiście zawsze możesz to zrobić:
Ale takie podejście jest ponad trzy razy wolniejsze niż
apply
podejście z góry na mojej maszynie.Możesz to również zrobić, używając
dict.get
:źródło
.map()
rozwiązanie jest ~ 10 razy szybsze niż.apply()
..apply()
zajmuje 47 sekund, w porównaniu z jedynie 5,91 sekundy.map()
.Poniższe jest wolniejsze niż w tym przypadku podejścia tutaj , ale możemy obliczyć dodatkową kolumnę na podstawie zawartości więcej niż jednej kolumny, a dla dodatkowej kolumny można obliczyć więcej niż dwie wartości.
Prosty przykład wykorzystujący tylko kolumnę „Ustaw”:
Przykład z większą ilością kolorów i większej liczby kolumn branych pod uwagę:
Edycja (21.06.2019): Za pomocą plydata
Możliwe jest również użycie plydata do robienia tego rodzaju rzeczy (wydaje się to nawet wolniejsze niż używanie
assign
iapply
, chociaż).Proste
if_else
:Zagnieżdżone
if_else
:źródło
Być może było to możliwe dzięki nowszym aktualizacjom Pand, ale myślę, że poniższe są najkrótszą i być może najlepszą odpowiedzią na pytanie. Możesz użyć tej
.loc
metody i użyć jednego lub kilku warunków, w zależności od potrzeb.Podsumowanie kodu:
Wyjaśnienie:
dodaj kolumnę „kolor” i ustaw wszystkie wartości na „czerwony”
Zastosuj swój pojedynczy warunek:
lub wiele warunków, jeśli chcesz:
Możesz przeczytać o operatorach logicznych Pandas i wyborze warunkowym tutaj: Operatory logiczne do indeksowania wartości logicznych w Pandach
źródło
df.loc[(df['Set']=="Z") & (df['Type']=="A"), 'Color'] = "green"
Jedna linijka z
.apply()
metodą jest następująca:Następnie
df
ramka danych wygląda następująco:źródło
Jeśli pracujesz z ogromnymi danymi, najlepiej byłoby zapamiętać podejście:
Takie podejście będzie najszybsze, gdy będziesz mieć wiele powtarzanych wartości. Moją ogólną zasadą jest zapamiętywanie, kiedy:
data_size
>10**4
&n_distinct
<data_size/4
Ex Zapamiętaj w skrzynce 10 000 wierszy z 2500 lub mniej wyraźnymi wartościami.
źródło
random.choices()
.