pandas中如何按组的模式填写na

How to fill na in pandas by the mode of a group

我有一个这样的 Pandas 数据框:

  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的值与之对应。我想用 b 值的模式填充 b 的所有 nan 值,并按 a.

的相应值分组

生成的数据框应如下所示:

  df = 

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

上面b1b对应a1的模式。同样,b2 是对应于 a2 的模式。最后a3没有数据,所以用全局方式填充b2.

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

编辑:

如果有组ab上没有数据,则用全局模式填充。

尝试:

# 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)