A partire da Panda 0.20 ix è deprecato . Il modo giusto è usare df.loc
ecco un esempio funzionante
>>> 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
>>>
Spiegazione:
Come spiegato nel documento qui , .loc
è principalmente basato sull'etichetta, ma può anche essere usato con una matrice booleana .
Quindi, quello che stiamo facendo sopra sta applicando df.loc[row_index, column_index]
:
- Sfruttando il fatto che
loc
può prendere un array booleano come maschera che dice ai panda in quale sottoinsieme di righe vogliamo cambiarerow_index
- Lo sfruttamento del fatto
loc
è anche basato sull'etichetta per selezionare la colonna usando l'etichetta 'B'
incolumn_index
Possiamo usare logico, condizione o qualsiasi operazione che ritorni una serie di booleani per costruire l'array di booleani. Nell'esempio sopra, vogliamo rows
che contenga un 0
, per quello che possiamo usare df.A == 0
, come puoi vedere nell'esempio sotto, questo restituisce una serie di booleani.
>>> 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
>>>
Quindi, utilizziamo l'array sopra di booleani per selezionare e modificare le righe necessarie:
>>> df.loc[df.A == 0, 'B'] = np.nan
>>> df
A B
0 0 NaN
1 1 0
2 0 NaN
Per ulteriori informazioni, consultare la documentazione di indicizzazione avanzata qui .
where
come mostrato in questa soluzione di seguito