Python Pandas高效统计Section与Group组合频率并标记组内最大值
高效实现Pandas DataFrame的两个需求
没问题,针对你的大数据量场景,咱们用Pandas的向量化分组操作就能高效搞定这两个需求,完全不用循环,速度拉满:
第一步:新增Section&Group组合的出现频率列
要保留所有行的同时给每个组合标记出现次数,用groupby + transform('size')是最优解——transform会自动把分组计算的结果广播回原DataFrame的每一行,而且是Pandas底层优化过的操作,处理百万级行也毫无压力。
假设你的原DataFrame名为df,代码如下:
# 新增Frequency列,记录每个Section+Group组合的出现次数 df['Frequency'] = df.groupby(['Section', 'Group'])['Section'].transform('size')
这里用['Section']只是随便选了一个存在的列,transform('size')计算的是每个分组的行数,和选哪个列无关,所以也可以用df.groupby(['Section', 'Group']).transform('size'),效果一样。
第二步:标记每个Section中Count列的最大值行
同样用分组+transform的思路,先拿到每个Section组内Count的最大值,再和原Count列做比较生成布尔列,全程向量化,效率极高。
代码如下:
# 新增Is_Max_Count列,标记当前行是否为对应Section中Count的最大值 df['Is_Max_Count'] = df['Count'] == df.groupby('Section')['Count'].transform('max')
如果同一个Section里有多个行的Count等于最大值,这些行都会被标记为True,完全符合你的需求。
示例效果展示
假设原DataFrame是这样的:
| Section | Group | Count |
|---|---|---|
| A | X | 5 |
| A | X | 5 |
| A | Y | 8 |
| B | X | 3 |
| B | Y | 3 |
| B | Y | 3 |
执行第一步后:
| Section | Group | Count | Frequency |
|---|---|---|---|
| A | X | 5 | 2 |
| A | X | 5 | 2 |
| A | Y | 8 | 1 |
| B | X | 3 | 1 |
| B | Y | 3 | 2 |
| B | Y | 3 | 2 |
执行第二步后:
| Section | Group | Count | Frequency | Is_Max_Count |
|---|---|---|---|---|
| A | X | 5 | 2 | False |
| A | X | 5 | 2 | False |
| A | Y | 8 | 1 | True |
| B | X | 3 | 1 | True |
| B | Y | 3 | 2 | True |
| B | Y | 3 | 2 | True |
内容的提问来源于stack exchange,提问作者MaMo
相关产品推荐
相关产品推荐

