Używając tego jako punktu wyjścia:
a = [['10', '1.2', '4.2'], ['15', '70', '0.03'], ['8', '5', '0']]
df = pd.DataFrame(a, columns=['one', 'two', 'three'])
Out[8]:
one two three
0 10 1.2 4.2
1 15 70 0.03
2 8 5 0
Chcę użyć czegoś w rodzaju if
oświadczenia w pandach.
if df['one'] >= df['two'] and df['one'] <= df['three']:
df['que'] = df['one']
Zasadniczo sprawdź każdy wiersz za pomocą if
instrukcji, utwórz nową kolumnę.
Dokumenty mówią, że należy używać, .all
ale nie ma przykładu ...
python
pandas
if-statement
dataframe
Merlinie
źródło
źródło
if
instrukcja jestFalse
?object
. Pozwala to na przechowywanie dowolnych obiektów Pythona w kolumnie, ale odbywa się to kosztem wolniejszych obliczeń numerycznych. Tak więc, jeśli kolumna przechowuje dane liczbowe, preferowane jest użycie NaN dla nie-liczb.a = [['10', '1.2', '4.2'], ['15', '70', '0.03'], ['8', '5', '0']]
. Tworzy to mylące wyniki z „poprawnym” kodem:df['que'] = df['one'][(df['one'] >= df['two']) & (df['one'] <= df['three'])]
daje wyniki10
w pierwszym wierszu, podczas gdy powinno dać wynik,NaN
gdyby dane wejściowe były liczbami całkowitymi.Odpowiedzi:
Możesz użyć np.where . Jeśli
cond
jest tablicą logiczną, aA
iB
są tablicami, todefiniuje C jako równe
A
gdziecond
jest True, aB
gdziecond
jest False.import numpy as np import pandas as pd a = [['10', '1.2', '4.2'], ['15', '70', '0.03'], ['8', '5', '0']] df = pd.DataFrame(a, columns=['one', 'two', 'three']) df['que'] = np.where((df['one'] >= df['two']) & (df['one'] <= df['three']) , df['one'], np.nan)
plony
one two three que 0 10 1.2 4.2 10 1 15 70 0.03 NaN 2 8 5 0 NaN
Jeśli masz więcej niż jeden warunek, możesz zamiast tego użyć np.select . Na przykład, jeśli chcesz
df['que']
wyrównaćdf['two']
kiedydf['one'] < df['two']
, toconditions = [ (df['one'] >= df['two']) & (df['one'] <= df['three']), df['one'] < df['two']] choices = [df['one'], df['two']] df['que'] = np.select(conditions, choices, default=np.nan)
plony
one two three que 0 10 1.2 4.2 10 1 15 70 0.03 70 2 8 5 0 NaN
Jeśli możemy założyć, że
df['one'] >= df['two']
kiedydf['one'] < df['two']
jest fałszywe, to warunki i wybory można uprościć doconditions = [ df['one'] < df['two'], df['one'] <= df['three']] choices = [df['two'], df['one']]
(Założenie może nie być prawdziwe, jeśli
df['one']
lubdf['two']
zawierają NaN).Zwróć na to uwagę
a = [['10', '1.2', '4.2'], ['15', '70', '0.03'], ['8', '5', '0']] df = pd.DataFrame(a, columns=['one', 'two', 'three'])
definiuje DataFrame z wartościami ciągów. Ponieważ wyglądają na numeryczne, może lepiej byłoby przekonwertować te ciągi na liczby zmiennoprzecinkowe:
df2 = df.astype(float)
Zmienia to jednak wyniki, ponieważ łańcuchy porównują znak po znaku, podczas gdy liczby zmiennoprzecinkowe są porównywane numerycznie.
In [61]: '10' <= '4.2' Out[61]: True In [62]: 10 <= 4.2 Out[62]: False
źródło
Możesz użyć
.equals
dla kolumn lub całych ramek danych.df['col1'].equals(df['col2'])
Jeśli są równe, ta instrukcja zwróci
True
, w przeciwnym razieFalse
.źródło
Możesz użyć apply () i zrobić coś takiego
df['que'] = df.apply(lambda x : x['one'] if x['one'] >= x['two'] and x['one'] <= x['three'] else "", axis=1)
lub jeśli wolisz nie używać lambdy
def que(x): if x['one'] >= x['two'] and x['one'] <= x['three']: return x['one'] return '' df['que'] = df.apply(que, axis=1)
źródło
Jednym ze sposobów jest użycie serii boolowskiej do indeksowania kolumny
df['one']
. Daje to nową kolumnę, w którejTrue
wpisy mają taką samą wartość, jak ten sam wiersz, codf['one']
iFalse
wartościNaN
.Szereg boolowski jest po prostu podany przez twoje
if
oświadczenie (chociaż konieczne jest użycie&
zamiastand
):>>> df['que'] = df['one'][(df['one'] >= df['two']) & (df['one'] <= df['three'])] >>> df one two three que 0 10 1.2 4.2 10 1 15 70 0.03 NaN 2 8 5 0 NaN
Jeśli chcesz, aby
NaN
wartości zostały zastąpione innymi wartościami, możesz użyćfillna
metody w nowej kolumnieque
. Użyłem tutaj0
zamiast pustego ciągu:>>> df['que'] = df['que'].fillna(0) >>> df one two three que 0 10 1.2 4.2 10 1 15 70 0.03 0 2 8 5 0 0
źródło
Umieść każdy warunek w nawiasach, a następnie
&
połącz warunki za pomocą operatora:df.loc[(df['one'] >= df['two']) & (df['one'] <= df['three']), 'que'] = df['one']
Możesz wypełnić niepasujące wiersze, używając po prostu
~
operatora („nie”), aby odwrócić dopasowanie:df.loc[~ ((df['one'] >= df['two']) & (df['one'] <= df['three'])), 'que'] = ''
Musisz użyć
&
i~
zamiastand
i,not
ponieważ operatory&
i~
działają element po elemencie.Wynik końcowy:
df Out[8]: one two three que 0 10 1.2 4.2 10 1 15 70 0.03 2 8 5 0
źródło
Użyj,
np.select
jeśli masz wiele warunków do sprawdzenia z ramki danych i wyprowadzisz konkretny wybór w innej kolumnieconditions=[(condition1),(condition2)] choices=["choice1","chocie2"] df["new column"]=np.select=(condtion,choice,default=)
Uwaga: Żaden z warunków i żadna z opcji nie powinny pasować, powtórz wybrany tekst, jeśli dla dwóch różnych warunków masz takie same możliwości
źródło
Myślę, że najbliższe intuicji OP jest stwierdzenie inline if:
df['que'] = (df['one'] if ((df['one'] >= df['two']) and (df['one'] <= df['three']))
źródło
df['que'] = (df['one'] if ((df['one'] >= df['two']) and (df['one'] <= df['three'])) ^ SyntaxError: unexpected EOF while parsing
Użyj wyrażenia lambda:
df[df.apply(lambda x: x['col1'] != x['col2'], axis = 1)]
źródło