如何基于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
相关产品推荐
相关产品推荐

