问题描述
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)