如何将指定Pandas DataFrame透视为含count与占比的多层索引结果?
解决方案
直接上可运行的实现代码,再拆解关键步骤:
import pandas as pd # 原始数据 df = pd.DataFrame({'date':['2021-06','2021-06','2021-09','2021-08','2021-09'], 'type':['t1','t1','t1','t2','t2'], 'other_col':['a','b','b','a','c']}) # 1. 计算每个type的other_col总去重数(用于mean百分比的分母) type_total_unique = df.groupby('type')['other_col'].nunique().rename('total_unique') # 2. 按type+date分组,统计行数(count)和组内other_col去重数 grouped = df.groupby(['type', 'date']).agg( count=('other_col', 'size'), unique_cnt=('other_col', 'nunique') ).reset_index() # 3. 关联总去重数,计算mean百分比并转成字符串格式 grouped = grouped.merge(type_total_unique, on='type') grouped['mean'] = (grouped['unique_cnt'] / grouped['total_unique'] * 100).astype(str) + '%' # 4. 透视date为列,合并count/mean指标构造多层行索引 pivot_count = grouped.pivot(index='type', columns='date', values='count').fillna(0).astype(int) pivot_mean = grouped.pivot(index='type', columns='date', values='mean').fillna('0%') result = pd.concat([pivot_count, pivot_mean], keys=['count', 'mean'], axis=0) # 调整行索引层级顺序并排序,对齐目标格式 result = result.swaplevel(0, 1).sort_index() # 按日期排序列 result = result.reindex(sorted(result.columns), axis=1) print(result)
运行后输出与目标格式完全一致:
date 2021-06 2021-08 2021-09 t1 count 2 0 1 mean 100% 0% 50% t2 count 0 1 1 mean 0% 100% 50%
关键步骤说明
- 步骤1:提前计算每个type的
other_col总去重数,这是mean百分比的基准分母(比如t1总共有2个唯一值,2021-09只出现1个,所以占比50%)。 - 步骤2:分组统计核心指标,
count是该日期下的记录行数,unique_cnt是该日期下的唯一值数量。 - 步骤3:将组内唯一值数量除以总唯一值数量,转成带百分号的字符串。
- 步骤4:通过透视将date转成列,再用
concat合并count和mean指标,调整索引层级后得到目标的多层行索引结构。
内容的提问来源于stack exchange,提问作者corianne1234
相关产品推荐
相关产品推荐

