我正在尝试用Pandas DataFrame中的行的总和替换某些列中的NaN。请参见下面的示例数据:
Items| Estimate1| Estimate2| Estimate3|
Item1| NaN | NaN | 8
Item2| NaN | NaN | 5.5|
我希望有估计1&对于项目1和2,2分别为8和5.5。
到目前为止,我已尝试使用df.fillna(df.sum(), inplace=True)
,但DataFrame没有任何变化。任何人都可以帮我纠正我的代码或推荐正确的方法吗?
答案 0 :(得分:3)
提供axis=1
似乎不起作用(因为填充系列仅适用于逐列情况,而不适用于逐行)。
解决方法是将每行的总和“广播”到与原始索引/列具有相同索引/列的数据帧。稍加修改的示例数据框:
In [57]: df = pd.DataFrame([[np.nan, 3.3, 8], [np.nan, np.nan, 5.5]], index=['Item1', 'Item2'], columns=['Estimate1', 'Estimate2', 'Estimate3'])
In [58]: df
Out[58]:
Estimate1 Estimate2 Estimate3
Item1 NaN 3.3 8.0
Item2 NaN NaN 5.5
In [59]: fill_value = pd.DataFrame({col: df.sum(axis=1) for col in df.columns})
In [60]: fill_value
Out[60]:
Estimate1 Estimate2 Estimate3
Item1 11.3 11.3 11.3
Item2 5.5 5.5 5.5
In [61]: df.fillna(fill_value)
Out[61]:
Estimate1 Estimate2 Estimate3
Item1 11.3 3.3 8.0
Item2 5.5 5.5 5.5
有一个开放的增强问题:https://github.com/pydata/pandas/issues/4514
答案 1 :(得分:1)
作为替代方案,您还可以使用带有apply
表达式的lambda
,如下所示:
df.apply(lambda row: row.fillna(row.sum()), axis=1)
产生预期的结果
Estimate1 Estimate2 Estimate3
Item1 11.3 3.3 8.0
Item2 5.5 5.5 5.5
虽然不确定效率。