如何通过分组方式在熊猫中填充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)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...