[Python] 我如何在熊猫数据框的一列中用Zero替换所有的NaN值


Answers

我相信DataFrame.fillna()会为你做到这一点。

链接到文档的数据框系列

例:

In [7]: df
Out[7]: 
          0         1
0       NaN       NaN
1 -0.494375  0.570994
2       NaN       NaN
3  1.876360 -0.229738
4       NaN       NaN

In [8]: df.fillna(0)
Out[8]: 
          0         1
0  0.000000  0.000000
1 -0.494375  0.570994
2  0.000000  0.000000
3  1.876360 -0.229738
4  0.000000  0.000000

要仅填写一列中的NaN,请选择该列。 在这种情况下,我使用inplace = True来实际更改df的内容。

In [12]: df[1].fillna(0, inplace=True)
Out[12]: 
0    0.000000
1    0.570994
2    0.000000
3   -0.229738
4    0.000000
Name: 1

In [13]: df
Out[13]: 
          0         1
0       NaN  0.000000
1 -0.494375  0.570994
2       NaN  0.000000
3  1.876360 -0.229738
4       NaN  0.000000
Question

我有一个数据框如下

      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

当我尝试应用一个函数的金额列时,我得到以下错误。

ValueError: cannot convert float NaN to integer

我已经尝试应用函数使用从数学模块.isnan我已经尝试了熊猫.replace属性我尝试从熊猫0.9的.sparse数据属性我也尝试如果NaN == NaN语句在函数中。 我也看过这篇文章如何用R数据框中的零代替NA值? 同时看一些其他的文章。 我尝试过的所有方法都没有工作或不认识NaN。 任何提示或解决方案,将不胜感激。




您可以使用replaceNaN更改为0

import pandas as pd
import numpy as np

# for column
df['column'] = df['column'].replace(np.nan, 0)

# for whole dataframe
df = df.replace(np.nan, 0)

# inplace
df.replace(np.nan, 0, inplace=True)



以下代码适用于我。

import pandas

df = pandas.read_csv('somefile.txt')

df = df.fillna(0)



我只是想提供一些更新/特例,因为它看起来像人们仍然来到这里。 如果您使用多索引或使用索引切片器,则inplace = True选项可能不足以更新您选择的切片。 例如,在2x2级别的多索引中,这不会改变任何值(如熊猫0.15):

idx = pd.IndexSlice
df.loc[idx[:,mask_1],idx[mask_2,:]].fillna(value=0,inplace=True)

“问题”在于链接打破了更新原始数据框的能力。 我把“问题”放在引号中,因为在某些情况下导致不通过这些链条进行解释的设计决策是有充分理由的。 此外,这是一个复杂的例子(虽然我真的遇到它),但同样可能适用于较少级别的索引,具体取决于你如何分片。

解决方案是DataFrame.update:

df.update(df.loc[idx[:,mask_1],idx[[mask_2],:]].fillna(value=0))

这是一条线,读得相当好(有点),并且消除了任何不必要的中间变量或循环的混乱,同时允许你将fillna应用到你喜欢的任何多层片上。

如果任何人都可以找到这个地方不起作用,请发表评论,我已经搞乱了它,看着源代码,它似乎至少解决了我的多索引切片问题。




不保证切片返回视图或副本。 你可以做

df['column']=df['column'].fillna(value)



fillna()是最好的方法。 代码 -

#fill all Nan value with zero
df = df.fillna(0)

如果你不想使用' df = df.fillna(value) ',你也可以使用inplace 。 代码 -

df.fillna(0, inplace=True)



你应该使用fillna() 。 这个对我有用。

df = df.fillna(value_to_replace_null)