繁体   English   中英

熊猫数据框:用该行的均值替换nan

[英]Pandas data frame: replace nan with the mean of that row

假设我有以下数据框:

import numpy as np
import pandas as pd
df = pd.DataFrame({'A' : [np.nan, 1,2], 
                                  'B' : [3, np.nan, 4], 
                                  'C': [5,6,np.nan]}).T

>>df
    0   1   2
A NaN   1   2
B   3 NaN   4
C   5   6 NaN

要更换np.nan在该行的平均np.nan发生后,我用了fillna方法如下:

fill_value = pd.DataFrame({col: df.mean(axis=1) for col in df.columns})
df.fillna(fill_value, inplace=True)

Yields:
     0    1    2
A  1.5  1.0  2.0
B  3.0  3.5  4.0
C  5.0  6.0  5.5

我不确定为什么我无法获得填充方法来执行相同的操作:

mask = np.isnan(df)
masked_df = np.ma.masked_array(df, mask)
means = np.mean(masked_df, axis=0)
df = masked_df.filled(means)

Yields: 
array([[ 4. ,  1. ,  2. ],
       [ 3. ,  3.5,  4. ],
       [ 5. ,  6. ,  3. ]])

知道如何获取filled方法来做同样的事情吗? 谢谢。

这是因为在填充的示例中,平均值计算是错误的(您使用axis = 0而不是1)。 如果我使用第一个示例中的fill_values看起来不错,

import numpy as np
import pandas as pd
df = pd.DataFrame({'A' : [np.nan, 1,2], 
                                  'B' : [3, np.nan, 4], 
                                  'C': [5,6,np.nan]}).T
mask = np.isnan(df)
masked_df = np.ma.masked_array(df, mask)
fill_value = pd.DataFrame({col: df.mean(axis=1) for col in df.columns})
df = masked_df.filled(fill_value)
print(df)

输出:

[[ 1.5  1.   2. ]
 [ 3.   3.5  4. ]
 [ 5.   6.   5.5]]

在下面的工作中,您可以计算逐行均值,并将其作为替换NaN值的值进行传递,您必须对均值进行转置以便正确执行对齐:

In [154]:
df.fillna(df.mean(axis=1).T, axis=0)

Out[154]:
     0    1    2
A  1.5  1.0  2.0
B  3.0  3.5  4.0
C  5.0  6.0  5.5

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM