如何在Pandas DataFrame中标记分组的最大值
在Pandas中为分组内最大值添加布尔标记列
给原始DataFrame添加标记分组内最大值的布尔列,有两种常用的简洁实现方式:
方法一:使用groupby.transform(推荐)
这是最直接高效的方式,transform会将分组计算的最大值广播回原DataFrame的每一行,直接和原amount列做比较即可生成布尔列:
import pandas as pd df = (pd.DataFrame( [ ('A', "29.08.2022", 100), ('A', "30.08.2022", 200), ('A', "31.08.2022", 300), ('B', "27.08.2022", 50), ('B', "38.08.2022", 1000), ('B', "30.08.2022", 10), ], columns = ["customer_id", "purchase_date", "amount"]) ) # 添加is_max列 df['is_max'] = df['amount'] == df.groupby('customer_id')['amount'].transform('max') print(df)
运行后输出结果:
customer_id purchase_date amount is_max 0 A 29.08.2022 100 False 1 A 30.08.2022 200 False 2 A 31.08.2022 300 True 3 B 27.08.2022 50 False 4 B 38.08.2022 1000 True 5 B 30.08.2022 10 False
方法二:使用merge合并分组最大值
如果需要先保留分组最大值的中间列,可以先计算每个客户的最大金额,再合并回原DataFrame后做比较:
# 计算每个客户的最大金额并重置索引 max_amounts = df.groupby('customer_id')['amount'].max().reset_index(name='max_amount') # 合并回原DataFrame df = df.merge(max_amounts, on='customer_id') # 生成is_max列并删除中间列 df['is_max'] = df['amount'] == df['max_amount'] df = df.drop('max_amount', axis=1) print(df)
这个方法会得到和方法一完全一致的结果,适合需要查看分组最大值的场景。
内容的提问来源于stack exchange,提问作者Jan
相关产品推荐
相关产品推荐

