按BR_NM统计唯一CUS_ID,再按REGION汇总求和的Pandas实现问题
解决按BR_NM统计唯一客户后按REGION汇总的问题
原始数据
首先创建示例DataFrame:
import pandas as pd import numpy as np df = pd.DataFrame({'BR_NM': ['HN', 'HN', 'HP'], 'CUS_ID': ['12345', '12345', '12345'], 'ACC_ID': ['12345_1', '12345_2', '12345_3'], 'REGION': ['North', 'North', 'North'], 'CUS_TYPE': ['Individual', 'Individual', 'Individual']})
数据预览:
| BR_NM | CUS_ID | ACC_ID | REGION | CUS_TYPE |
|---|---|---|---|---|
| HN | 12345 | 12345_1 | North | Individual |
| HN | 12345 | 12345_2 | North | Individual |
| HP | 12345 | 12345_3 | North | Individual |
需求说明
需先按BR_NM统计唯一CUS_ID的数量(同一客户在不同BR_NM下需分别计数,此场景中客户12345在HN和HP各计1次,总计2),再按REGION字段汇总求和,期望输出:
REGION CUS_TYPE North 0 North Individual 2
问题分析
直接使用pivot_table并设置aggfunc=pd.Series.nunique会得到结果1,因为该操作是对整个REGION分组内的CUS_ID直接去重,没有先按BR_NM做层级分组统计,不符合需求。
解决方案
通过两层分组实现:先按BR_NM、REGION、CUS_TYPE统计唯一客户数,再按REGION和CUS_TYPE汇总求和。
代码实现
# 第一步:按BR_NM、REGION、CUS_TYPE分组,统计每个BR下的唯一客户数 grouped_by_br = df.groupby(['BR_NM', 'REGION', 'CUS_TYPE'])['CUS_ID'].nunique().reset_index() # 第二步:按REGION和CUS_TYPE汇总求和 final_result = grouped_by_br.groupby(['REGION', 'CUS_TYPE'])['CUS_ID'].sum().reset_index(name='North') print(final_result)
简洁链式写法
final_result = (df.groupby(['BR_NM', 'REGION', 'CUS_TYPE'])['CUS_ID'] .nunique() .groupby(level=['REGION', 'CUS_TYPE']) .sum() .reset_index(name='North')) print(final_result)
输出结果
REGION CUS_TYPE North 0 North Individual 2
内容的提问来源于stack exchange,提问作者hoa tran
相关产品推荐
相关产品推荐

