微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – Pandas Dataframe:用行平均值替换NaN

我正在努力学习大熊猫,但我对以下内容感到困惑.我想替换NaNs是一个具有行平均值的数据帧.因此像df.fillna(df.mean(axis = 1))这样的东西应该可以工作,但由于某种原因它不适合我.我错过了什么,我做错了什么?是因为它没有实施;见link here

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

解决方法:

如注释,fillna的axis参数是NotImplemented.

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

注意:这在此非常关键,因为您不希望用第n行平均值填充第n列.

现在你需要迭代:

In [11]: 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)

In [12]: df
Out[12]:
   c1  c2   c3
0   1   4  7.0
1   2   5  3.5
2   3   6  9.0

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐