pandas fillna 不工作
- 2025-04-10 09:47:00
- admin 原创
- 23
问题描述:
我有一个包含 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
解决方案 1:
你需要inplace=True
df[1].fillna(0, inplace=True)
解决方案 2:
或者:
df = df.replace(np.nan, 0)
#或您认为合适的任何其他值
当我在 Na 操作之后立即应用某些 str.replace() 操作时,df.replace(np.nan, 0) 或 df.fillna(0) 让我感到困惑。因此请注意命令的顺序 -> 先使用 str.replace(),然后再使用 fillna()
解决方案 3:
您需要分配值df = df.fillna(t)
解决方案 4:
您有两个选择:
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:
检查为什么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 值。注释行似乎有效。
解决方案 6:
我发现这是因为 pandas 的 mode() 函数现在输出一个有两列的数据框。
因此,如果您不添加 [0] df[col].fillna(df[col].mode()[0], inplace = True)
,则 fillna() 将不起作用,因为 mode() 函数不返回标量。
相关推荐
热门文章
项目管理软件有哪些?
热门标签
曾咪二维码
扫码咨询,免费领取项目管理大礼包!
云禅道AD