pandas fillna 不起作用

34 投票
6 回答
107798 浏览
提问于 2025-04-18 16:08

我有一个数据表,里面有一些空值(nans):

>>>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版本。

6 个回答

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 值。注释掉的那几行代码似乎是有效的。

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)
5

你需要把这个值赋给变量:df = df.fillna(t)

9

另外一种方法

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

当我在处理完一些字符串替换操作后,紧接着进行Na值处理时,发现使用 df.replace(np.nan, 0)df.fillna(0) 会让我感到困惑。所以要注意你命令的顺序 -> 先进行字符串替换,再填充Na值

87

你需要在代码中加上 inplace=True 这个参数。

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

撰写回答