如何通过分组方式在熊猫中填充NA

问题描述

我有一个这样的Pandas Dataframe:

  df = 

       a                    b
       a1                   b1
       a1                   b2
       a1                   b1
       a1                   Nan
       a2                   b1
       a2                   b2
       a2                   b2
       a2                   Nan
       a2                   b2
       a3                   Nan

对于a的每个值,b可以具有多个与之对应的b值。我想用nan值的模式和b的对应值组成的模式来填充b的所有a值。

结果数据帧应如下所示:

  df = 

       a                    b
       a1                   b1
       a1                   b2
       a1                   b1
       a1                   ***b1***
       a2                   b1
       a2                   b2
       a2                   b2
       a2                   **b2**
       a2                   b2
       a3                   b2

b1上方是b对应于a1的模式。同样,b2是与a2对应的模式。最后,a3没有数据,因此它以全局模式b2填充。

对于b列的每个nan值,我都想用b列的值的模式填充它,但是对于a的特定值,无论哪种模式。

编辑:

如果存在a上没有数据的组b,则以全局模式填充它。

解决方法

尝试:

# lazy grouping
groups = df.groupby('a')

# where all the rows within a group is NaN
all_na = groups['b'].transform(lambda x: x.isna().all())

# fill global mode
df.loc[all_na,'b'] = df['b'].mode()[0]

# fill with local mode
mode_by_group = groups['b'].transform(lambda x: x.mode()[0])
df['b'] = df['b'].fillna(mod_by_group)