pandas 如何获取groupby的最大计数(最频繁项)

a14dhokn  于 2023-01-24  发布在  其他
关注(0)|答案(2)|浏览(208)

我有一个 Dataframe 。我想按行对一些列进行分组,然后形成一个计数列,然后获得计数的最大值,为它创建一个列,并将其附加到 Dataframe 。
我试过:

df["max_pred"] = df.groupby(['fid','prefix','pred_text1'], 
                             sort=False)["pred_text1"].transform("max")

但是,它列出了pred_text1具有最大重复次数的行,但我需要它的修复次数
例如:

A  B  C
a  d  b
a  d  b
a  d  b
a  d  a
a  d  a
b  b  c
b  b  c
b  b  d

如果我将行按A和B分组,然后计算C,得到每组的最大值,并将其存储在新的列F中,我期望:

A  B  F   E
a  d  3   b
a  d  3   b
a  d  3   b
a  d  3   b
a  d  3   b
b  b  2   c
b  b  2   c
b  b  2   c

E显示频率在F中指定的最频繁项目

cu6pst1q

cu6pst1q1#

您可以将groupby.transformvalue_counts一起使用:

df['F'] = (df.groupby(['A', 'B'])['C']
             .transform(lambda g: g.value_counts(sort=False).max())
          )

collections.Counter的变体:

from collections import Counter

df['F'] = (df.groupby(['A', 'B'])['C']
             .transform(lambda g: max(Counter(g).values()))
          )

输出:

A  B  C  F
0  a  d  b  3
1  a  d  b  3
2  a  d  b  3
3  a  d  a  3
4  a  d  a  3
5  b  b  c  2
6  b  b  c  2
7  b  b  d  2
更新

我在这里使用merge

cols = ['A', 'B']
out = df.merge(df[cols+['C']]
                 .value_counts().groupby(cols).head(1)
                 .reset_index(name='F').rename(columns={'C': 'E'})
               )

输出:

A  B  C  E  F
0  a  d  b  b  3
1  a  d  b  b  3
2  a  d  b  b  3
3  a  d  a  b  3
4  a  d  a  b  3
5  b  b  c  c  2
6  b  b  c  c  2
7  b  b  d  c  2
lf5gs5x2

lf5gs5x22#

另一种选择是使用get_dummies;对于足够大的数据,我希望@mozway的解决方案能够更好地扩展:

temp = (pd
       .get_dummies(df, columns = ['C'], prefix="",prefix_sep="")
       .groupby(['A','B'])
       .transform('sum'))
(df
.drop(columns='C')
.assign(F=temp.max(1), E = temp.idxmax(1))
)
   A  B  F  E
0  a  d  3  b
1  a  d  3  b
2  a  d  3  b
3  a  d  3  b
4  a  d  3  b
5  b  b  2  c
6  b  b  2  c
7  b  b  2  c

相关问题