首页 > 解决方案 > 根据分组数据计算 DataFrame 模式

问题描述

我有以下数据框:

>>> df = pd.DataFrame({"a": [1, 1, 1, 1, 2, 2, 3, 3, 3], "b": [1, 5, 7, 9, 2, 4, 6, 14, 5], "c": [1, 0, 0, 1, 1, 1, 1, 0, 1]})
>>> df
   a   b  c
0  1   1  1
1  1   5  0
2  1   7  0
3  1   9  1
4  2   2  1
5  2   4  1
6  3   6  1
7  3  14  0
8  3   5  1

我想计算c每个唯一值的列模式,a然后选择c具有该值的行。

这是我自己的解决方案:

>>> major_types = df.groupby(['a'])['c'].apply(lambda x: pd.Series.mode(x)[0])
>>> df = df.merge(major_types, how="left", right_index=True, left_on="a", suffixes=("", "_major"))
>>> df = df[df['c'] == df['c_major']].drop(columns="c_major", axis=1)

这将输出以下内容:

>>> df
   a  b  c
1  1  5  0
2  1  7  0
4  2  2  1
5  2  4  1
6  3  6  1
8  3  5  1

这对于大型 DataFrame 来说是非常不够的。知道该怎么做吗?

标签: pythonpandasdataframepandas-groupby

解决方案


IIUC,GroupBy.transform而不是apply+merge

df.loc[df['c'].eq(df.groupby('a')['c'].transform(lambda x: x.mode()[0]))]

   a  b  c
1  1  5  0
2  1  7  0
4  2  2  1
5  2  4  1
6  3  6  1
8  3  5  1

或者

s = df.groupby(['a','c'])['c'].transform('size')
df.loc[s.eq(s.groupby(df['c']).transform('max'))]

推荐阅读