You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将指定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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 15:57:16