首页 > 解决方案 > pandas中如何以group的方式填写na

问题描述

我有一个像这样的熊猫数据框:

  df = 

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

对于 的每一个值ab都可以有多个b对应的值。我想用由 的相应值分组的值的模式来填充 的所有nan值。bba

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

  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 没有数据,所以它通过 global mode 填充它b2

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

编辑:

如果有一个组a没有数据b,则以全局模式填充。

标签: python-3.xpandasfillna

解决方案


尝试:

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

推荐阅读