A partir de pandas, 0,20 ix está obsoleto . O caminho certo é usar o df.loc
aqui está um exemplo de trabalho
>>> 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
>>>
Explicação:
Conforme explicado no documento aqui , .loc
é principalmente baseado em rótulo, mas também pode ser usado com uma matriz booleana .
Portanto, o que estamos fazendo acima é a aplicação df.loc[row_index, column_index]
de:
- Explorando o fato de que
loc
podemos usar uma matriz booleana como uma máscara que diz aos pandas em que subconjunto de linhas queremos alterarrow_index
- A exploração do fato
loc
também é baseada em rótulo para selecionar a coluna usando o rótulo 'B'
nocolumn_index
Podemos usar lógica, condição ou qualquer operação que retorne uma série de booleanos para construir a matriz de booleanos. No exemplo acima, queremos rows
que contenha um 0
, para que possamos usar df.A == 0
, como você pode ver no exemplo abaixo, isso retorna uma série de booleanos.
>>> 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
>>>
Em seguida, usamos a matriz de booleanos acima para selecionar e modificar as linhas necessárias:
>>> df.loc[df.A == 0, 'B'] = np.nan
>>> df
A B
0 0 NaN
1 1 0
2 0 NaN
Para mais informações, consulte a documentação avançada de indexação aqui .
where
como visto em esta solução abaixo