Pandas新手求指导:按客户分组统计金额Top2部门及交易频次
解决Pandas按客户提取前两大交易部门(含金额和频次)的问题
嘿,刚上手Pandas和groupby的话,这个需求其实可以一步步拆解来实现,完全用你提到的groupby、sum、sort和转置类操作搞定~先理清楚思路,再上代码:
第一步:准备测试数据
先把你给出的原始数据转换成可直接操作的Pandas DataFrame:
import pandas as pd # 原始数据 data = { 'Cus_No': [111, 111, 111, 111, 111, 111, 111, 222, 222, 222, 222, 222, 222, 222], 'Date': ['6-Jun-18', '6-Jun-18', '8-Jun-18', '8-Aug-18', '12-Dec-18', '15-Feb-17', '18-Jan-18', '6-Jun-18', '6-Jun-18', '8-Jun-18', '8-Aug-18', '12-Dec-18', '15-Feb-17', '18-Jan-18'], 'Dprtmnt': ['AAA', 'AAA', 'BBB', 'CCC', 'BBB', 'AAA', 'AAA', 'DDD', 'AAA', 'AAA', 'DDD', 'AAA', 'CCC', 'CCC'], 'Amount': [100, 50, 125, 130, 200, 10, 20, 100, 50, 125, 130, 200, 10, 20] } df = pd.DataFrame(data)
第二步:计算每个客户+部门的总金额和交易频次
用groupby按客户和部门分组,分别统计金额总和(sum)和交易次数(统计Date的数量,即count):
# 分组聚合:总金额Sum,交易频次Frqnc grouped = df.groupby(['Cus_No', 'Dprtmnt']).agg( Sum=('Amount', 'sum'), Frqnc=('Date', 'count') ).reset_index()
这一步后,每个客户的每个部门都有了对应的总金额和交易次数。
第三步:按总金额降序排序,取前两大部门
对每个客户的分组按Sum降序排列,再提取每个客户的前2条数据:
# 按客户分组,内部按总金额从高到低排序 sorted_groups = grouped.groupby('Cus_No').apply( lambda x: x.sort_values('Sum', ascending=False) ).reset_index(drop=True) # 取每个客户的前两大部门 top2 = sorted_groups.groupby('Cus_No').head(2)
第四步:转置重塑成期望的列结构
用unstack实现转置,再调整列名到你想要的格式:
# 给每个客户的部门添加排名标记(Top1、Top2) top2['rank'] = top2.groupby('Cus_No').cumcount() + 1 # 转置:把排名转成列 result = top2.set_index(['Cus_No', 'rank']).unstack() # 合并层级索引,改成目标列名格式 result.columns = [f'Top{rank}{col}' for col, rank in result.columns] # 重置索引,让Cus_No变回普通列 result = result.reset_index()
最终结果
运行完代码后,result就会和你期望的输出完全一致:
Cus_No Top1Dprtmnt Top1Sum Top1Frqnc Top2Dprtmnt Top2Sum Top2Frqnc 0 111 BBB 325 2 AAA 180 4 1 222 AAA 375 3 DDD 230 2
整个流程完全用到了你要求的groupby、sum、sort以及转置操作(unstack属于转置类操作),每一步都很清晰,适合新手理解~
内容的提问来源于stack exchange,提问作者Danish
相关产品推荐
相关产品推荐

