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
上面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)
我有一个这样的 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
上面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)