Eu tenho um quadro de dados como abaixo
itm Date Amount
67 420 2012-09-30 00:00:00 65211
68 421 2012-09-09 00:00:00 29424
69 421 2012-09-16 00:00:00 29877
70 421 2012-09-23 00:00:00 30990
71 421 2012-09-30 00:00:00 61303
72 485 2012-09-09 00:00:00 71781
73 485 2012-09-16 00:00:00 NaN
74 485 2012-09-23 00:00:00 11072
75 485 2012-09-30 00:00:00 113702
76 489 2012-09-09 00:00:00 64731
77 489 2012-09-16 00:00:00 NaN
Quando tento aplicar uma função na coluna Valor, recebo o seguinte erro.
ValueError: cannot convert float NaN to integer
Eu tentei aplicar uma função usando .isnan do módulo de matemática Eu tentei o atributo .replace do pandas Eu tentei o atributo de dados .sparse do pandas 0.9 Eu também tentei se NaN == NaN em uma função. Também observei este artigo. Como substituo valores NA por zeros em um dataframe R? enquanto olha para alguns outros artigos. Todos os métodos que tentei não funcionaram ou não reconhecem o NaN. Quaisquer dicas ou soluções serão apreciadas.
Respostas:
Eu acredito
DataFrame.fillna()
que fará isso por você.Link para o Documentos para um quadro de dados e para uma série .
Exemplo:
Para preencher os NaNs em apenas uma coluna, selecione apenas essa coluna. neste caso, estou usando inplace = True para realmente alterar o conteúdo do df.
EDITAR:
Para evitar a
SettingWithCopyWarning
, use a funcionalidade específica da coluna integrada:fonte
df[1]
é uma visualização e não uma cópia do DF original? Obviamente, se houver uma situação rara em que seja uma cópia, isso causaria um bug super problemático. Existe uma declaração clara sobre isso na documentação dos pandas?Não é garantido que a fatia retorne uma visualização ou uma cópia. Você pode fazer
fonte
Você pode usar
replace
para alterarNaN
para0
:fonte
NaN
? ou também substituirá o valor ondeNA
ouNaN
comodf.fillna(0)
? Estou procurando uma solução que substitua apenas o valor onde existeNaN
e nãoNA
NaN
valores ie, ondenp.isnan
é TrueEu só queria fornecer um pouco de atualização / caso especial, pois parece que as pessoas ainda vêm aqui. Se você estiver usando um índice múltiplo ou usando um slicer de índice, a opção inplace = True pode não ser suficiente para atualizar a fatia que você escolheu. Por exemplo, em um multi-índice de nível 2x2, isso não altera nenhum valor (a partir dos pandas 0,15):
O "problema" é que o encadeamento interrompe a capacidade de preenchimento para atualizar o quadro de dados original. Coloquei "problema" entre aspas porque existem boas razões para as decisões de design que levaram a não interpretar essas cadeias em determinadas situações. Além disso, este é um exemplo complexo (embora eu realmente tenha encontrado isso), mas o mesmo pode se aplicar a menos níveis de índices, dependendo de como você fatia.
A solução é DataFrame.update:
É uma linha, lê razoavelmente bem (mais ou menos) e elimina qualquer confusão desnecessária com variáveis ou loops intermediários, permitindo aplicar fillna a qualquer fatia de vários níveis que você quiser!
Se alguém puder encontrar lugares em que isso não funcione, poste nos comentários. Estou brincando com ele e olhando a fonte e parece resolver pelo menos meus problemas de fatia de vários índices.
fonte
O código abaixo funcionou para mim.
fonte
Maneira fácil de preencher os valores ausentes: -
preenchimento de colunas de string: quando as colunas de string têm valores ausentes e valores de NaN.
preenchimento de colunas numéricas: quando as colunas numéricas têm valores ausentes e NaN.
preenchendo NaN com zero:
fonte
Você também pode usar dicionários para preencher os valores de NaN das colunas específicas no DataFrame, em vez de preencher todo o DF com algum valor.
fonte
Considerando que a coluna específica
Amount
na tabela acima é do tipo inteiro. O seguinte seria uma solução:Da mesma forma, você pode preenchê-lo com vários tipos de dados
float
,str
como etc.Em particular, eu consideraria o tipo de dados para comparar vários valores da mesma coluna.
fonte
Para substituir um valor em pandas
se
inplace = False
, em vez de atualizar o df (dataframe), ele retornará os valores modificados.fonte
Se você quiser convertê-lo em um dataframe do pandas, também poderá fazer isso usando
fillna
.Isso retornará o seguinte:
fonte
Existem duas opções disponíveis principalmente; em caso de imputação ou preenchimento de valores ausentes NaN / np.nan com apenas substituições numéricas (na (s) coluna (s):
df['Amount'].fillna(value=None, method= ,axis=1,)
é suficiente:A partir da documentação:
value: escalar, dict, Series ou DataFrame Valor a ser usado para preencher furos (por exemplo, 0), alternadamente um dict / Series / DataFrame de valores especificando qual valor usar para cada índice (para uma Série) ou coluna (para um DataFrame) . (os valores fora do dict / Series / DataFrame não serão preenchidos). Este valor não pode ser uma lista.
O que significa que 'strings' ou 'constantes' não são mais permitidas de serem imputadas.
Para imputações mais especializadas, use SimpleImputer () :
fonte
Para substituir nan em colunas diferentes por maneiras diferentes:
fonte