Począwszy od pand w wersji 0.20 ix jest przestarzały . Właściwym sposobem jest użycie df.loc
oto działający przykład
>>> import pandas as pd
>>> import numpy as np
>>> df = pd.DataFrame({"A":[0,1,0], "B":[2,0,5]}, columns=list('AB'))
>>> df.loc[df.A == 0, 'B'] = np.nan
>>> df
A B
0 0 NaN
1 1 0
2 0 NaN
>>>
Wyjaśnienie:
Jak wyjaśniono w dokumencie tutaj , .loc
jest oparty głównie etykieta, ale może być również używany z logicznej tablicy .
Tak więc to, co robimy powyżej, to stosowanie df.loc[row_index, column_index]
przez:
- Wykorzystując fakt, że
loc
może przyjąć tablicę logiczną jako maskę, która mówi pandom, w którym podzbiorze wierszy chcemy zmienićrow_index
- Wykorzystanie tego faktu
loc
jest również oparte na etykiecie, aby wybrać kolumnę za pomocą etykiety 'B'
wcolumn_index
Możemy użyć operacji logicznej, warunkowej lub dowolnej operacji, która zwraca serię wartości logicznych, aby skonstruować tablicę wartości logicznych. W powyższym przykładzie chcemy, rows
aby zawierała a 0
, w tym celu możemy użyć df.A == 0
, jak widać w przykładzie poniżej, zwraca to serię wartości logicznych.
>>> df = pd.DataFrame({"A":[0,1,0], "B":[2,0,5]}, columns=list('AB'))
>>> df
A B
0 0 2
1 1 0
2 0 5
>>> df.A == 0
0 True
1 False
2 True
Name: A, dtype: bool
>>>
Następnie używamy powyższej tablicy wartości logicznych, aby wybrać i zmodyfikować niezbędne wiersze:
>>> df.loc[df.A == 0, 'B'] = np.nan
>>> df
A B
0 0 NaN
1 1 0
2 0 NaN
Aby uzyskać więcej informacji, zapoznaj się z zaawansowaną dokumentacją dotyczącą indeksowania tutaj .
where
jak widać na poniższym rozwiązaniu