基于另一列求和的Pandas透视表实现(模拟双索引效果)
实现双索引风格的Pandas透视表(日期+配送/返程维度求和)
嘿,我来帮你搞定这个需求!你的数据里每条记录包含出发日期+配送金额和返程日期+返程金额两组关联数据,要实现类似双索引的透视表求和,核心是先把宽格式的数据转成适合聚合的长格式,再用透视表做分组求和。
第一步:准备示例数据
先把你给出的示例数据补全完整:
import pandas as pd df = pd.DataFrame( { "dep_date": [201701, 201701, 201702, 201703], "del_amount": [100, 200, 300, 400], "ret_date": [201703, 201702, 201703, 201705], "ret_amount": [50, 75, 150, 175] } ) print(df)
输出的完整数据是:
dep_date del_amount ret_date ret_amount 0 201701 100 201703 50 1 201701 200 201702 75 2 201702 300 201703 150 3 201703 400 201705 175
第二步:将宽格式数据转换为长格式
我们需要把「出发日期+配送金额」和「返程日期+返程金额」这两组数据合并成统一的日期-金额-类型结构,这样才能方便后续的透视聚合:
# 提取出发相关数据,重命名列并标记类型 dep_part = df[["dep_date", "del_amount"]].rename(columns={"dep_date": "date", "del_amount": "amount"}) dep_part["biz_type"] = "配送" # 提取返程相关数据,重命名列并标记类型 ret_part = df[["ret_date", "ret_amount"]].rename(columns={"ret_date": "date", "ret_amount": "amount"}) ret_part["biz_type"] = "返程" # 合并两个部分为长格式数据 long_df = pd.concat([dep_part, ret_part], ignore_index=True) print(long_df.head())
转换后的长格式数据片段:
date amount biz_type 0 201701 100 配送 1 201701 200 配送 2 201702 300 配送 3 201703 400 配送 4 201703 50 返程
第三步:创建双索引风格的透视表
现在我们可以用pd.pivot_table来实现两种常见的双索引效果:
效果1:日期作为行索引,业务类型作为列索引,展示各日期的总金额
pivot_table1 = pd.pivot_table( long_df, index="date", columns="biz_type", values="amount", aggfunc="sum", fill_value=0 # 没有数据的日期-类型组合填充0 ) print(pivot_table1)
输出结果:
biz_type 配送 返程 date 201701 300 0 201702 300 75 201703 400 200 201705 0 175
效果2:日期+业务类型作为双行索引,展示每组的总金额
如果想要更贴近「双索引行」的形式,可以把index设置为列表:
pivot_table2 = pd.pivot_table( long_df, index=["date", "biz_type"], values="amount", aggfunc="sum" ).reset_index() print(pivot_table2)
输出结果:
date biz_type amount 0 201701 配送 300 1 201702 配送 300 2 201702 返程 75 3 201703 配送 400 4 201703 返程 200 5 201705 返程 175
补充说明
- 转长格式是关键:因为原始数据中日期和金额是分两组存储的,只有转换成统一的结构,才能让透视表同时处理出发和返程的维度。
aggfunc="sum"指定了求和的聚合方式,如果需要其他统计(比如均值、计数),替换成对应函数即可。
内容的提问来源于stack exchange,提问作者O Pardal
相关产品推荐
相关产品推荐

