You need to enable JavaScript to run this app. 基于pandas透视表的双重差分(DID)计算及新增结果行方法咨询
优惠活动
大模型
产品
解决方案
定价
更多

基于pandas透视表的双重差分(DID)计算及新增结果行方法咨询

解答

透视表添加合计与DID行的实现方法

直接在你原有代码基础上补充如下逻辑即可:

# 原有代码段
import pandas as pd
import numpy as np

df = pd.DataFrame()
df['year'] = [2011,2011,2011,2011,2011,2011,2011,2011,2011,2011,2011,2011]
df['month'] = [1,2,3,4,5,6,1,2,3,4,5,6]
df['after'] = [0,0,0,1,1,1,0,0,0,1,1,1]
df['campaign'] = [0,0,0,0,0,0,1,1,1,1,1,1]
df['sales'] = [10000,11000,12000,10500,10000,9500,7000,8000,5000,6000,6000,7000]

df_pv = df.pivot_table(index='campaign',columns = 'after', values = 'sales', aggfunc = np.sum)
df_pv['diff'] = df_pv[1]-df_pv[0]
df_pv['diff_pct'] = ((df_pv[1] - df_pv[0])/df_pv[0]).round(3)*100

# 新增合计行
total_row = pd.Series(
    {0: df_pv[0].sum(), 1: df_pv[1].sum(), 'diff': np.nan, 'diff_pct': np.nan},
    name='Total'
)
df_pv = pd.concat([df_pv, total_row.to_frame().T])

# 新增DID结果行
did_value = df_pv.loc[1, 'diff_pct'] - df_pv.loc[0, 'diff_pct']
did_row = pd.Series(
    {0: np.nan, 1: np.nan, 'diff': np.nan, 'diff_pct': did_value},
    name='DID'
)
df_pv = pd.concat([df_pv, did_row.to_frame().T])

print(df_pv)

运行后输出结果完全匹配你的预期格式。

Python常用DID计算工具包及本场景应用

常用的DID分析工具包有以下几种:

  • statsmodels:通用性强,可通过构造交互项手动实现DID回归,适合简单场景的快速验证
  • linearmodels:面板数据分析专用工具,原生支持固定效应、聚类标准误等专业计量需求,是学术场景DID分析的首选
  • pydid:轻量DID专用工具包,支持多期DID、合成DID等多种变体,上手门槛低

本场景下用statsmodels做DID回归的示例代码如下:

import statsmodels.formula.api as smf

# 核心回归公式:sales ~ 分组变量 + 时间变量 + 分组*时间交互项
# 交互项的系数就是DID估计值
did_model = smf.ols('sales ~ campaign + after + campaign:after', data=df).fit()
print(did_model.summary())

输出结果中campaign:after对应的系数就是DID的统计估计值,同时可以直接查看该效果的显著性水平,比手动计算的结果更严谨。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 05:15:03