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

如何基于Pandas multi-index DataFrame计算日期维度类别计数与占比

解决Pandas多重索引下的类别统计与占比计算问题

嘿,我来帮你搞定这个统计需求!针对你描述的DataFrame结构,我们可以分几步来实现同一日期下各类别的计数和占比统计,最终生成你需要的表格。

步骤1:重置多重索引

首先,我们得把包含date和name的多重索引转换成普通列,这样后续操作起来更顺手:

# 将多重索引转为普通列
df_reset = df.reset_index()

步骤2:从name字段提取类别

观察你的数据格式,name字段的结构是[代码]-[类别]-[子类别/后缀](比如A122630-stock-a),我们需要提取中间的类别部分。对于只有两个部分的name(比如A167860-bond),直接取第二个部分即可:

# 拆分name字段,提取类别(取短横线分隔后的第二个元素)
df_reset['category'] = df_reset['name'].str.split('-', expand=True)[1]

步骤3:统计各类别的计数

接下来按date和提取出的category分组,统计每个组合的记录数:

# 按日期和类别分组,计算计数
count_df = df_reset.groupby(['date', 'category']).size().reset_index(name='计数')

步骤4:计算占比

要得到占比,我们需要先算出每个日期的总记录数,再用类别计数除以总记录数,最后格式化为百分比:

# 计算每个日期的总记录数
total_count = df_reset.groupby('date').size().reset_index(name='总计数')

# 合并计数数据和总计数数据
result_df = count_df.merge(total_count, on='date')

# 计算占比并格式化为百分比(保留整数百分比)
result_df['占比'] = (result_df['计数'] / result_df['总计数']).apply(lambda x: f"{x:.0%}")

步骤5:整理最终表格

最后,我们只保留需要的列,并把category重命名为变量:

# 选择目标列并重命名
final_result = result_df[['date', 'category', '计数', '占比']].rename(columns={'category': '变量'})

最终效果

运行完上述代码后,final_result就是你需要的表格,针对你给出的示例数据,输出会是这样:

date        变量  计数   占比
0  20170331  raw-material    1  10%
1  20170331          stock    7  70%
2  20170331           bond    1  10%
3  20170331         curncy    1  10%

如果你的数据有特殊情况(比如name的分隔格式不一致),可以调整str.split的参数或者增加异常处理,但针对你给出的示例数据,上面的代码完全适用。

内容的提问来源于stack exchange,提问作者Hannah Lee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:02:31