Suponha que eu tenho um DataFrame do pandas com duas colunas, A e B. Eu gostaria de modificar esse DataFrame (ou criar uma cópia) para que B seja sempre NaN sempre que A for 0. Como eu conseguiria isso?
Eu tentei o seguinte
df['A'==0]['B'] = np.nan
e
df['A'==0]['B'].values.fill(np.nan)
sem sucesso.
where
como visto em esta solução abaixoRespostas:
Use
.loc
para indexação baseada em etiqueta:A
df.A==0
expressão cria uma série booleana que indexa as linhas,'B'
seleciona a coluna. Você também pode usar isso para transformar um subconjunto de uma coluna, por exemplo:Não sei o suficiente sobre os internos do pandas para saber exatamente por que isso funciona, mas o problema básico é que, às vezes, a indexação em um DataFrame retorna uma cópia do resultado e, às vezes, retorna uma exibição no objeto original. De acordo com a documentação aqui , esse comportamento depende do comportamento numpy subjacente. Descobri que acessar tudo em uma operação (em vez de [uma] [duas]) é mais provável que funcione na configuração.
fonte
Aqui está dos documentos do pandas sobre indexação avançada:
A seção explicará exatamente o que você precisa! Acontece que
df.loc
(como .ix foi descontinuado - como muitos apontaram abaixo) pode ser usado para fatiar / cortar dados em um quadro de dados. E. Também pode ser usado para definir as coisas.Então a resposta de Bren está dizendo 'encontre-me todos os lugares onde
df.A == 0
, selecione a colunaB
e defina-a comonp.nan
'fonte
loc[selection criteria, columns I want]
adere perfeitamente à sua mente ...A partir de pandas, 0,20 ix está obsoleto . O caminho certo é usar o df.loc
aqui está um exemplo de trabalho
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:loc
podemos usar uma matriz booleana como uma máscara que diz aos pandas em que subconjunto de linhas queremos alterarrow_index
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 um0
, para que possamos usardf.A == 0
, como você pode ver no exemplo abaixo, isso retorna uma série de booleanos.Em seguida, usamos a matriz de booleanos acima para selecionar e modificar as linhas necessárias:
Para mais informações, consulte a documentação avançada de indexação aqui .
fonte
Para um grande aumento de velocidade, use a função where do NumPy.
Configuração
Crie um DataFrame de duas colunas com 100.000 linhas com alguns zeros.
Solução rápida com
numpy.where
Horários
Numpy
where
é cerca de 4x mais rápidofonte
.values
emnp.where(df.a.values == 0, np.nan, df.b.values)
? Parece quenp.where(df.a == 0, np.nan, df.b)
também funciona?Para substituir várias colunas, converta em matriz numpy usando
.values
:fonte