如何在Pandas DataFrame中按id选pair最小值行且保留同pair所有数据?
解决Pandas按id分组保留pair最小值对应行的问题
假设我们有这样一个Pandas DataFrame:
print(df) # 输出: tconst title bool id pair 0 t01 Blow True 1 1 1 t02 Blow False 1 4 2 t03 Fast TRUE 2 2 3 t04 Fast FALSE 2 2 4 t05 Storm True 3 9
需求是:当id相同时,选取pair列最小值对应的行;如果同一id下pair值相同,则保留所有对应行,最终得到这样的结果:
tconst title bool id pair 0 t01 Blow True 1 1 2 t03 Fast TRUE 2 2 3 t04 Fast FALSE 2 2 4 t05 Storm True 3 9
直接用普通的groupby聚合方法会丢失数据,这里给你两种简单有效的实现方案:
方法一:用transform映射最小值后筛选
这种方法逻辑直观,容易理解:
- 用
transform方法计算每个id分组对应的pair最小值,得到一个和原DataFrame长度一致的Series - 筛选出原DataFrame中
pair值等于对应分组最小值的行
代码示例:
import pandas as pd # 构造示例DataFrame df = pd.DataFrame({ 'tconst': ['t01', 't02', 't03', 't04', 't05'], 'title': ['Blow', 'Blow', 'Fast', 'Fast', 'Storm'], 'bool': ['True', 'False', 'TRUE', 'FALSE', 'True'], 'id': [1, 1, 2, 2, 3], 'pair': [1, 4, 2, 2, 9] }) # 计算每个id对应的最小pair值,生成映射列 min_pair_per_id = df.groupby('id')['pair'].transform('min') # 筛选符合条件的行 result = df[df['pair'] == min_pair_per_id] print(result)
方法二:用groupby的filter方法直接筛选
这种写法更简洁,直接在分组内完成筛选逻辑:
result = df.groupby('id').filter(lambda x: x['pair'] == x['pair'].min())
lambda函数会对每个id分组进行检查,保留所有pair值等于该分组最小值的行,效果和方法一完全一致。
为什么这两种方法不会丢数据?
普通的groupby().agg()或groupby().first()这类聚合方法会压缩分组结果,只保留单行数据;而我们用的transform和filter都是基于原DataFrame的行进行筛选,会完整保留所有符合条件的行和所有列的数据,完美匹配你的需求。
内容的提问来源于stack exchange,提问作者Steven
相关产品推荐
相关产品推荐

