Eu tenho um DataFrame e desejo substituir os valores em uma coluna específica que excedem um valor com zero. Eu pensei que essa era uma maneira de conseguir isso:
df[df.my_channel > 20000].my_channel = 0
Se eu copiar o canal em um novo quadro de dados, é simples:
df2 = df.my_channel
df2[df2 > 20000] = 0
Isso faz exatamente o que eu quero, mas parece não funcionar com o canal como parte do DataFrame original.
Respostas:
.ix
O indexador funciona bem para a versão do pandas anterior a 0.20.0, mas desde o pandas 0.20.0, o.ix
indexador está obsoleto , portanto, você deve evitar usá-lo. Em vez disso, você pode usar.loc
ouiloc
indexadores. Você pode resolver esse problema:Ou, em uma linha,
mask
ajuda a selecionar as linhas em quedf.my_channel > 20000
éTrue
, enquantodf.loc[mask, column_name] = 0
define o valor 0 para as linhas selecionadas onde semask
mantém na coluna cujo nome écolumn_name
.Update: Neste caso, você deve usar
loc
porque, se usariloc
, receberá um aviso deNotImplementedError
que a indexação booleana baseada em iLocation em um tipo inteiro não está disponível .fonte
Experimentar
Observação: desde a v0.20.0,
ix
foi preterido em favor deloc
/iloc
.fonte
np.where
função funciona da seguinte maneira:No seu caso, você gostaria de:
fonte
O motivo pelo qual seu dataframe original não é atualizado é porque a indexação encadeada pode fazer com que você modifique uma cópia em vez de uma exibição de seu dataframe. Os documentos dão este conselho:
Você tem algumas alternativas: -
loc
+ Indexação booleanaloc
pode ser usado para definir valores e oferece suporte a máscaras booleanas:mask
+ Indexação booleanaVocê pode atribuir à sua série:
Ou você pode atualizar sua série no local:
np.where
+ Indexação booleanaVocê pode usar o NumPy atribuindo sua série original quando sua condição não for satisfeita; entretanto, as duas primeiras soluções são mais limpas, pois alteram explicitamente apenas os valores especificados.
fonte
Eu usaria a
lambda
função em umSeries
ouDataFrame
assim:Não afirmo que seja uma forma eficiente, mas funciona bem.
fonte
loc
aqui, comodf.loc[: , 'my_column'] = df['my_column'].map(f)
. Não sei se é rápido como os que você adicionou abaixo.Experimente isto:
df.my_channel = df.my_channel.where(df.my_channel <= 20000, other= 0)
ou
df.my_channel = df.my_channel.mask(df.my_channel > 20000, other= 0)
fonte