在另一列Y中为每个分类变量填充X列的NaN值,其中值为X.

时间:2017-06-26 04:02:24

标签: python pandas dataframe nan median

这很难说。但是,让我告诉你我正在努力实现的目标。

df

Y  X
a  10
a  5
a  NaN
b  12
b  13
b  NaN
c  5
c  NaN
c  5
c  6


Y: 10 non-null object
X: 7 non-null int64

从Y列取类别'a',它具有中值X值(10 + 5/2),'a'的另一个缺失值必须用此中值填充。

类似地,对于Y列中的类别'b',在X列中的非缺失值中,中值X值为,(12 + 13/2)

对于Y列中的类别'c',在X列中的非缺失值中,中值X值为5(最中间值)

我使用了很长的重复代码,如下所示。

    grouped = df.groupby(['Y'])[['X']]
    grouped.agg([np.median])

                X
                median
    Y
    a           7.5
    b           12.5
    c           5

    df.X = df.X.fillna(-1)

    df.loc[(df['Y'] == 'a') & (df['X'] == -1), 'X'] = 7.5
    df.loc[(df['Y'] == 'b') & (df['X'] == -1), 'X'] = 12.5
    df.loc[(df['Y'] == 'c') & (df['X'] == -1), 'X'] = 5

我被告知不仅要重复,还要使用魔法数字,这应该避免。

我想编写一个有效填充此功能的函数。

1 个答案:

答案 0 :(得分:1)

使用java.langgroupby
转换看起来像

transform

这与以前的索引相同。因此,我们可以轻松地将其用于df.groupby('Y').X.transform('median') 0 7.5 1 7.5 2 7.5 3 12.5 4 12.5 5 12.5 6 5.0 7 5.0 8 5.0 9 5.0 Name: X, dtype: float64

fillna

您可以制作数据集的新副本

df.X.fillna(df.groupby('Y').X.transform('median'))

0    10.0
1     5.0
2     7.5
3    12.0
4    13.0
5    12.5
6     5.0
7     5.0
8     5.0
9     6.0
Name: X, dtype: float64

df.assign(X=df.X.fillna(df.groupby('Y').X.transform('median'))) Y X 0 a 10.0 1 a 5.0 2 a 7.5 3 b 12.0 4 b 13.0 5 b 12.5 6 c 5.0 7 c 5.0 8 c 5.0 9 c 6.0

fillna