Mam pozornie łatwe zadanie. Dataframe z 2 kolumnami: A i B. Jeśli wartości w B są większe niż wartości w A - zastąp te wartości wartościami A. Zrobiłem to wykonując df.B[df.B > df.A] = df.A
, jednak ostatnie uaktualnienie pand rozpoczęło się dając SettingWithCopyWarning
kiedy spotkałem się z tym łańcuchem zadanie. Oficjalna dokumentacja zaleca używanie .loc
.Zastąpienie wartości w kolumnie danych w oparciu o warunek
Okay, powiedziałem i zrobiłem to przez df.loc[df.B > df.A, 'B'] = df.A
i wszystko działa dobrze, chyba że kolumna B ma wszystkie wartości NaN
. Wtedy coś dziwnego się dzieje:
In [1]: df = pd.DataFrame({'A': [1, 2, 3],'B': [np.NaN, np.NaN, np.NaN]})
In [2]: df
Out[2]:
A B
0 1 NaN
1 2 NaN
2 3 NaN
In [3]: df.loc[df.B > df.A, 'B'] = df.A
In [4]: df
Out[4]:
A B
0 1 -9223372036854775808
1 2 -9223372036854775808
2 3 -9223372036854775808
Teraz, jeśli nawet jeden z elementów przez B spełnia warunek (większy niż), to wszystko działa poprawnie:
In [1]: df = pd.DataFrame({'A': [1, 2, 3],'B': [np.NaN, 4, np.NaN]})
In [2]: df
Out[2]:
A B
0 1 NaN
1 2 4
2 3 NaN
In [3]: df.loc[df.B > df.A, 'B'] = df.A
In [4]: df
Out[4]:
A B
0 1 NaN
1 2 2
2 3 NaN
Ale jeśli żaden z elementów śniadaniem spełniają wtedy wszystko NaN
s get zastępuje z -9223372036854775808
:
In [1]: df = pd.DataFrame({'A':[1,2,3],'B':[np.NaN,1,np.NaN]})
In [2]: df
Out[2]:
A B
0 1 NaN
1 2 1
2 3 NaN
In [3]: df.loc[df.B > df.A, 'B'] = df.A
In [4]: df
Out[4]:
A B
0 1 -9223372036854775808
1 2 1
2 3 -9223372036854775808
jest to błąd lub funkcja? Jak powinienem to zrobić?
Dziękujemy!
Zdecydowanie wygląda na błąd, prawdopodobnie dobry pomysł, aby zgłosić się na [https://github.com/pydata/pandas/issues](https://github.com/pydata/pandas/issues) – Marius