基于分组数据计算DataFrame模式。

问题描述 投票:0回答:1

我有以下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

对于大的DataFrames来说,它是非常不足的。有什么办法吗?

python pandas dataframe pandas-groupby
1个回答
1
投票

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'))]
© www.soinside.com 2019 - 2024. All rights reserved.