Python:基于两个分类列聚合DataFrame 获取金额最值
Pandas按Offer和Client分组聚合实现方案
原始样本数据
先把你的样本数据转换成Pandas DataFrame,原始数据如下:
Offer Client amount 'Off1' 'C1' 1000 'Off1' 'C1' 10 'Off1' 'C2' 2222 'Off1' 'C3' 0 'Off1' 'C3' 10 'Off2' 'C4' 11 'Off2' 'C1' 2342 'Off3' 'C3' 2131 'Off3' 'C100' 121 'Off3' 'C1' 1231 'Off3' 'C1' 31
1. 获取每个(Offer, Client)分组的金额最大值
我们可以用Pandas的groupby()方法按Offer和Client分组,然后调用max()方法获取每组的金额最大值,具体实现代码如下:
import pandas as pd # 构建原始DataFrame data = [ ('Off1', 'C1', 1000), ('Off1', 'C1', 10), ('Off1', 'C2', 2222), ('Off1', 'C3', 0), ('Off1', 'C3', 10), ('Off2', 'C4', 11), ('Off2', 'C1', 2342), ('Off3', 'C3', 2131), ('Off3', 'C100', 121), ('Off3', 'C1', 1231), ('Off3', 'C1', 31) ] df = pd.DataFrame(data, columns=['Offer', 'Client', 'amount']) # 按Offer和Client分组,取金额最大值 max_result = df.groupby(['Offer', 'Client'], as_index=False)['amount'].max() # 打印结果 print(max_result)
运行后得到的结果和你预期的一致:
Offer Client amount 0 Off1 C1 1000 1 Off1 C2 2222 2 Off1 C3 10 3 Off2 C1 2342 4 Off2 C4 11 5 Off3 C1 1231 6 Off3 C100 121 7 Off3 C3 2131
2. 扩展需求:获取每个客户在每个Offer下的金额最小值和最大值
这个需求可以用agg()方法来同时指定多个聚合函数,一次性获取每组的最小和最大金额,具体代码如下:
# 按Offer和Client分组,同时取金额的最小值和最大值 min_max_result = df.groupby(['Offer', 'Client'], as_index=False)['amount'].agg(min_amount='min', max_amount='max') # 打印结果 print(min_max_result)
运行后会得到每个分组的最小和最大金额:
Offer Client min_amount max_amount 0 Off1 C1 10 1000 1 Off1 C2 2222 2222 2 Off1 C3 0 10 3 Off2 C1 2342 2342 4 Off2 C4 11 11 5 Off3 C1 31 1231 6 Off3 C100 121 121 7 Off3 C3 2131 2131
补充说明
as_index=False参数可以让分组的列(Offer和Client)保持为普通列,而不是变成索引,这样输出格式更贴合你的预期结构。- 如果想要保留原始
amount列名的多级结构,也可以用agg({'amount': ['min', 'max']}),不过会生成多级列名,你可以根据实际需求选择。
内容的提问来源于stack exchange,提问作者PeCaDe
相关产品推荐
相关产品推荐

