Pandas的fillna方法无效

33

我有一个包含NaN值的数据框:

>>>df.head()
Out[1]: 
            JPM US SMALLER COMPANIES C ACC
1990-01-02                             NaN
1990-01-03                             NaN
1990-01-04                             NaN
1990-01-05                             NaN
1990-01-08                             NaN

我有另一个包含数值的数据框:

>>>t.head()
Out[1]: 
1990-01-02    51.95
1990-01-03    52.63
1990-01-04    53.04
1990-01-05    52.07
1990-01-08    51.73
Name: JPM US SMALLER COMPANIES C ACC, dtype: float64

很遗憾,df.fillna对我来说似乎不起作用:

>>>df.fillna( t ).head()
Out[1]: 
            JPM US SMALLER COMPANIES C ACC
1990-01-02                             NaN
1990-01-03                             NaN
1990-01-04                             NaN
1990-01-05                             NaN
1990-01-08                             NaN

[5 rows x 1 columns]

为什么会发生这种情况?我使用的是pandas 0.13.1版本。

2
哎呀,我修好了。 df 应该是一个 series,而不是 dataframe。之后它就正常工作了。 - Ginger
2
在使用 DataFrame 的情况下,您可以使用 DataFrame.where 将另一个框架的值用于替换空值。 - benjwadams
2
@benjwadams 我认为在这种情况下最好使用combine_firstupdate。它们是专门为此目的构建的,因此应该能帮助您避免错误。 - Roger Fan
6个回答

86

您需要使用 inplace=True

df[1].fillna(0, inplace=True)

你帮助我避免在我的pandas项目中创建太多的新对象。 - Yogamurthy
为什么这里需要 inplace=True - Lamma
3
df 对象就地修改,而不是创建其副本并修改该副本。 - Leonardo Maffei
你可以使用 df = df.fillna(0) 代替使用 inplace 吗? - RFAI
1
"inplace" 将被弃用,建议使用 "df = df.fillna(0)"。https://github.com/pandas-dev/pandas/issues/16529 - PeJota

9

或者:

df = df.replace(np.nan, 0) #或其他你认为适合的值

当我在NaN操作后立即应用某些str.replace()操作时,df.replace(np.nan, 0)df.fillna(0)让我感到困惑。因此,请注意命令的顺序->先执行str.replace(),然后再执行fillna()。


5
您需要将值赋给 df = df.fillna( t )

3

你有两个选择:

1)针对每个列具体设置

cols_fillna = ['column1','column2','column3']
# replace 'NaN' with zero in these columns
 for col in cols_fillna:
     df[col].fillna(0,inplace=True)
     df[col].fillna(0,inplace=True)

2) 对于整个数据框

df = df.fillna(0)

1

请检查为什么在迭代列时使用 fillna() 无法工作。 创建一个具有列的 DataFrame 并检查以下输出:

    for col in df.columns[df.isnull().any()]:
        df[col].fillna(df[col].mode(), inplace = True)
        #df[col].fillna(df[col].mode()[0], inplace = True)
        print(df[col].mode())
        #print(df[col].mode()[0])
        print(type(df[col].mode()))
        #print(type(df[col].mode()[0]))
    df.isnull().sum() / df.shape[0] * 100

之前的代码没有报错,但是没有填充NA值。被注释掉的代码似乎可以正常工作。


0

我发现这是因为pandas的mode()函数现在输出一个有两列的数据框。

所以,如果你不像df[col].fillna(df[col].mode()[0], inplace = True)中那样添加[0],fillna()函数将无法工作,因为mode()函数不返回标量。


df[col].mode()返回的是一个Series而不是一个dataframe。请编辑回答。 - rahul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接