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

Python餐厅数据集合并求助:Check_number与Date双键左连接报错

正确合并餐厅倍差法(DID)分析数据集的方法

一、先排查pd.merge报错的核心原因

你遇到的报错提示用pd.concat,大概率不是真的需要用concat,而是以下两个常见问题导致merge失败:

  1. 字段名大小写不匹配:你的代码里用了Check_Number,但原数据集的字段是Check_number(下划线后是小写n),字段名完全一致才能正常关联。
  2. 连接字段数据类型不统一:Date可能是字符串格式不一致(比如'2023-10-01' vs '10/01/2023'),或者Check_number一个是整数一个是字符串,都会导致merge匹配失败。

二、正确的pd.merge步骤

先统一字段名和数据类型,再分别合并四个数据集:

  1. 统一字段名:确保所有数据集的连接字段名完全一致(比如全部改为Check_number)
  2. 标准化数据类型:
    # 将所有数据集的Date转为datetime格式
    for df in [dfLargePre, dfSmallPre, dfLargePost, dfSmallPost, dfFood]:
        df['Date'] = pd.to_datetime(df['Date'], errors='coerce')
    
    # 将Check_number统一转为字符串(避免整数/字符串不匹配)
    for df in [dfLargePre, dfSmallPre, dfLargePost, dfSmallPost, dfFood]:
        df['Check_number'] = df['Check_number'].astype(str)
    
  3. 执行左连接合并:
    # 合并大桌变更前数据
    dfLargePre_merged = pd.merge(dfLargePre, dfFood, how='left', on=['Date', 'Check_number'])
    # 合并小桌变更前数据
    dfSmallPre_merged = pd.merge(dfSmallPre, dfFood, how='left', on=['Date', 'Check_number'])
    # 合并大桌变更后数据
    dfLargePost_merged = pd.merge(dfLargePost, dfFood, how='left', on=['Date', 'Check_number'])
    # 合并小桌变更后数据
    dfSmallPost_merged = pd.merge(dfSmallPost, dfFood, how='left', on=['Date', 'Check_number'])
    
  4. 处理合并后的空值:
    由于dfFood包含无关账单,left merge后Total_food为空的记录是原数据集中无对应食品账单的账单,可按需处理:
    # 用0填充空值(代表该账单无食品消费)
    for df in [dfLargePre_merged, dfSmallPre_merged, dfLargePost_merged, dfSmallPost_merged]:
        df['Total_food'] = df['Total_food'].fillna(0)
    
    # 或者仅保留有食品消费的账单
    # dfLargePre_merged = dfLargePre_merged.dropna(subset=['Total_food'])
    

三、什么时候需要用pd.concat?

pd.concat适用于纵向拼接结构完全相同的数据集,这在DID分析的最后一步非常有用:把四个合并后的数据集拼在一起,生成适合回归分析的完整数据集:

# 给每个数据集添加分组和时段标识(DID分析必需)
dfLargePre_merged['group'] = 'control'  # 大桌是对照组
dfLargePre_merged['period'] = 'pre'
dfSmallPre_merged['group'] = 'treatment'  # 小桌是处理组
dfSmallPre_merged['period'] = 'pre'
dfLargePost_merged['group'] = 'control'
dfLargePost_merged['period'] = 'post'
dfSmallPost_merged['group'] = 'treatment'
dfSmallPost_merged['period'] = 'post'

# 纵向拼接所有数据集
df_did_full = pd.concat(
    [dfLargePre_merged, dfSmallPre_merged, dfLargePost_merged, dfSmallPost_merged],
    ignore_index=True
)

拼接后的数据可以直接用于DID回归(比如用statsmodels拟合交互项模型)。

四、DID分析补充建议

  • 计算人均食品营收:如果你的数据里没有number_of_guests字段,可考虑用Total_food除以桌均人数(如果有历史数据可估算),或者直接用Total_food作为替代指标(若桌均人数波动较小)。
  • 验证平行趋势假设:在回归前,需检查处理组(小桌)和对照组(大桌)在菜单变更前的营收趋势是否一致,这是DID分析的核心前提。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 03:10:33