在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.
相关产品推荐
相关产品推荐

