Pandas Dataframe:用行平均值替换 NaN

新手上路,请多包涵

我正在尝试学习熊猫,但我对以下内容感到困惑。我想用行平均值替换 DataFrame 中的 NaN。因此,像 df.fillna(df.mean(axis=1)) 这样的东西应该可以工作,但由于某种原因它对我来说失败了。我错过了什么,我在做什么有问题吗?是因为没有实施吗? 在这里查看链接

import pandas as pd
import numpy as np
​
pd.__version__
Out[44]:
'0.15.2'

In [45]:
df = pd.DataFrame()
df['c1'] = [1, 2, 3]
df['c2'] = [4, 5, 6]
df['c3'] = [7, np.nan, 9]
df

Out[45]:
    c1  c2  c3
0   1   4   7
1   2   5   NaN
2   3   6   9

In [46]:
df.fillna(df.mean(axis=1))

Out[46]:
    c1  c2  c3
0   1   4   7
1   2   5   NaN
2   3   6   9

然而这样的事情看起来工作正常

df.fillna(df.mean(axis=0))

Out[47]:
    c1  c2  c3
0   1   4   7
1   2   5   8
2   3   6   9

原文由 Aenaon 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 748
2 个回答

正如评论的那样, fillna 的轴参数是 NotImplemented

 df.fillna(df.mean(axis=1), axis=1)

注意:这在这里很重要,因为您不想用第 n 行平均值填充第 n 列。

现在你需要遍历:

 m = df.mean(axis=1)
for i, col in enumerate(df):
    # using i allows for duplicate columns
    # inplace *may* not always work here, so IMO the next line is preferred
    # df.iloc[:, i].fillna(m, inplace=True)
    df.iloc[:, i] = df.iloc[:, i].fillna(m)

print(df)

   c1  c2   c3
0   1   4  7.0
1   2   5  3.5
2   3   6  9.0

另一种方法是 fillna 转置然后转置,这可能更有效……

 df.T.fillna(df.mean(axis=1)).T

原文由 Andy Hayden 发布,翻译遵循 CC BY-SA 4.0 许可协议

作为替代方案,您还可以使用 applylambda 表达式,如下所示:

 df.apply(lambda row: row.fillna(row.mean()), axis=1)

屈服也

    c1   c2   c3
0  1.0  4.0  7.0
1  2.0  5.0  3.5
2  3.0  6.0  9.0

原文由 Cleb 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题