我有一个熊猫数据框架如下:
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应用一个函数
我已经尝试了pandas .replace属性
我尝试了pandas 0.9中的.sparse data属性
我还尝试了在函数中if NaN == NaN语句。
我也看了这篇文章我如何替换NA值与零在一个R数据框架?同时看一些其他的文章。
我尝试过的所有方法都不起作用或不能识别NaN。
任何提示或解决方案将不胜感激。
我只是想提供一点更新/特殊情况,因为看起来人们仍然来这里。如果您正在使用多索引或其他索引切片器,inplace=True选项可能不足以更新您所选择的切片。例如,在2x2级别的多索引中,这不会改变任何值(例如pandas 0.15):
idx = pd.IndexSlice
df.loc[idx[:,mask_1],idx[mask_2,:]].fillna(value=0,inplace=True)
“问题”是链接破坏了fillna更新原始数据框架的能力。我把“问题”加上引号,是因为在某些情况下,设计决策导致不通过这些链进行解释是有充分理由的。此外,这是一个复杂的示例(尽管我真的遇到了它),但同样的情况可能适用于更少的索引级别,这取决于您如何进行切片。
解决方案是DataFrame.update:
df.update(df.loc[idx[:,mask_1],idx[[mask_2],:]].fillna(value=0))
它是一行,读起来相当好(某种程度上),并消除了任何不必要的中间变量或循环混乱,同时允许您将fillna应用到您喜欢的任何多级切片!
如果有人能找到这个不工作的地方,请在评论中发帖,我一直在搞砸它,看看源代码,它似乎至少解决了我的多索引切片问题。
我只是想提供一点更新/特殊情况,因为看起来人们仍然来这里。如果您正在使用多索引或其他索引切片器,inplace=True选项可能不足以更新您所选择的切片。例如,在2x2级别的多索引中,这不会改变任何值(例如pandas 0.15):
idx = pd.IndexSlice
df.loc[idx[:,mask_1],idx[mask_2,:]].fillna(value=0,inplace=True)
“问题”是链接破坏了fillna更新原始数据框架的能力。我把“问题”加上引号,是因为在某些情况下,设计决策导致不通过这些链进行解释是有充分理由的。此外,这是一个复杂的示例(尽管我真的遇到了它),但同样的情况可能适用于更少的索引级别,这取决于您如何进行切片。
解决方案是DataFrame.update:
df.update(df.loc[idx[:,mask_1],idx[[mask_2],:]].fillna(value=0))
它是一行,读起来相当好(某种程度上),并消除了任何不必要的中间变量或循环混乱,同时允许您将fillna应用到您喜欢的任何多级切片!
如果有人能找到这个不工作的地方,请在评论中发帖,我一直在搞砸它,看看源代码,它似乎至少解决了我的多索引切片问题。
我相信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
编辑:
为了避免SettingWithCopyWarning,使用内置的列特定功能:
df.fillna({1:0}, inplace=True)