我怎么可以用一个pandas数据框的列中的零来replace所有的NaN值

我有一个数据框如下

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 

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

我相信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,请select该列。 在这种情况下,我正在使用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 

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

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

我只是想提供一些更新/特例,因为看起来人们还是来这里。 如果您正在使用多索引或使用索引切片器,则inplace = True选项可能不足以更新您select的切片。 例如在一个2×2级别的多索引中,这不会改变任何值(如pandas0.15):

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

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

解决scheme是DataFrame.update:

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

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

如果有人可以find这个地方这不起作用,请发表评论,我一直在搞这个,看看来源,它似乎至less解决了我的多索引切片问题。

下面的代码为我工作。

 import pandas df = pandas.read_csv('somefile.txt') df = df.fillna(0) 

你可以使用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) 

你应该使用fillna() 。 它适用于我。

 df = df.fillna(value_to_replace_null) 

fillna()是最好的办法。 代码 –

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

如果您不想使用df = df.fillna(value) ”,也可以使用inplace 。 代码 –

 df.fillna(0, inplace=True)