我有一个熊猫数据框架如下:

      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。 任何提示或解决方案将不胜感激。


当前回答

主要有两种选择;在输入或填充缺失值NaN / np时。只有数值替换的Nan(跨列):

df(“金额”)。fillna(value=None, method=,axis=1,)是足够的:

来自文档:

取值:scalar、dict、Series或DataFrame 值用于填充孔(例如0),交替使用a dict/Series/DataFrame的值,指定用于哪个值 每个索引(对于Series)或列(对于DataFrame)。(值不 在dict/Series/DataFrame中将不会被填充)。此值不能 列个清单。

这意味着'字符串'或'常量'不再允许被赋值。

对于更专门的imputer,使用SimpleImputer():

from sklearn.impute import SimpleImputer
si = SimpleImputer(strategy='constant', missing_values=np.nan, fill_value='Replacement_Value')
df[['Col-1', 'Col-2']] = si.fit_transform(X=df[['C-1', 'C-2']])

其他回答

主要有两种选择;在输入或填充缺失值NaN / np时。只有数值替换的Nan(跨列):

df(“金额”)。fillna(value=None, method=,axis=1,)是足够的:

来自文档:

取值:scalar、dict、Series或DataFrame 值用于填充孔(例如0),交替使用a dict/Series/DataFrame的值,指定用于哪个值 每个索引(对于Series)或列(对于DataFrame)。(值不 在dict/Series/DataFrame中将不会被填充)。此值不能 列个清单。

这意味着'字符串'或'常量'不再允许被赋值。

对于更专门的imputer,使用SimpleImputer():

from sklearn.impute import SimpleImputer
si = SimpleImputer(strategy='constant', missing_values=np.nan, fill_value='Replacement_Value')
df[['Col-1', 'Col-2']] = si.fit_transform(X=df[['C-1', 'C-2']])

我相信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)

我只是想提供一点更新/特殊情况,因为看起来人们仍然来这里。如果您正在使用多索引或其他索引切片器,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应用到您喜欢的任何多级切片!

如果有人能找到这个不工作的地方,请在评论中发帖,我一直在搞砸它,看看源代码,它似乎至少解决了我的多索引切片问题。

下面的代码适合我。

import pandas

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

df = df.fillna(0)

您还可以使用字典来填充DataFrame中特定列的NaN值,而不是用一些oneValue填充所有DF。

import pandas as pd

df = pd.read_excel('example.xlsx')
df.fillna( {
        'column1': 'Write your values here',
        'column2': 'Write your values here',
        'column3': 'Write your values here',
        'column4': 'Write your values here',
        .
        .
        .
        'column-n': 'Write your values here'} , inplace=True)