Pandas数据框:用该行的平均值替换nan

时间:2015-06-02 07:07:03

标签: python numpy pandas

假设我有以下数据框:

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

我不确定为什么我不能用filled方法做同样的事情:

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方法做同样的事情吗?感谢。

2 个答案:

答案 0 :(得分:3)

这是因为填充示例中的平均计算错误(使用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]]

答案 1 :(得分:1)

以下工作,您可以计算行方式并将其作为值替换 roc_sector roc_symbol mean, max, min, count mean, max, min, count date, industry 2015-03-15 Health 123, 675, 12, 6 35, 5677, 12, 7 2015-03-15 Mining 456, 687, 11, 9 54, 7897, 44, 3 2015-03-16 Health 346, 547, 34, 8 67, 7699, 23, 5 2015-03-16 Mining 234, 879, 34, 2 35, 3457, 23, 4 2015-03-17 Health 345, 875, 54, 6 45, 7688, 12, 8 2015-03-17 Mining 876, 987, 23, 7 56, 5656, 43, 9 值,您必须转置均值以便正确执行对齐:

NaN