You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Pandas DataFrame中筛选组内最大子组对应的行

简洁实现:Pandas中按分组筛选子组行数最多的记录

需求说明

在Pandas DataFrame中完成以下操作:

  • 按Col1字段分组
  • 对每个Col1组,找出其中Col2对应行数最多的子组(支持保留并列最多的子组)
  • 从原DataFrame中筛选出属于这些子组的所有行

示例数据集

import pandas as pd

df = pd.DataFrame({
    'Col1': ['A', 'A', 'A', 'B', 'B', 'B', 'B', 'C'],
    'Col2': ['X', 'X', 'Y', 'M', 'M', 'N', 'N', 'P'],
    'Value': [1, 2, 3, 4, 5, 6, 7, 8]
})

用户原有繁琐实现

# 嵌套groupby+merge的复杂写法
counts = df.groupby(['Col1', 'Col2']).size().reset_index(name='Count')
max_counts = counts.groupby('Col1')['Count'].max().reset_index(name='MaxCount')
merged = counts.merge(max_counts, on='Col1')
top_subgroups = merged[merged['Count'] == merged['MaxCount']][['Col1', 'Col2']]
result = df.merge(top_subgroups, on=['Col1', 'Col2'])

简洁实现方案

方案1:取每个Col1组内首个行数最多的Col2子组

适合只需要保留每组内第一个出现的最大行数子组的场景:

# 按Col1分组,找出每组内Col2行数最多的取值
top_col2 = df.groupby('Col1')['Col2'].apply(lambda x: x.value_counts().idxmax())
# 匹配筛选原数据
result = df[df.apply(lambda row: row['Col2'] == top_col2[row['Col1']], axis=1)]

方案2:保留所有并列行数最多的子组

如果存在多个Col2子组在同一Col1组内行数相同且均为最大值,可保留所有这些子组:

# 计算每个(Col1, Col2)组合的行数
df['subgroup_count'] = df.groupby(['Col1', 'Col2'])['Col2'].transform('size')
# 计算每个Col1组内的最大行数
df['max_count_in_col1'] = df.groupby('Col1')['subgroup_count'].transform('max')
# 筛选符合条件的行并清理临时列
result = df[df['subgroup_count'] == df['max_count_in_col1']].drop(columns=['subgroup_count', 'max_count_in_col1'])

说明

两种方案均避免了多次merge操作,直接在原DataFrame上通过transform或分组计算完成筛选,代码更简洁高效。方案2能自动处理并列最大值的场景,无需额外判断。

内容的提问来源于stack exchange,提问作者Felipe D.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 16:23:27