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

基于另一列求和的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:20:36