Python餐厅数据集合并求助:Check_number与Date双键左连接报错
正确合并餐厅倍差法(DID)分析数据集的方法
一、先排查pd.merge报错的核心原因
你遇到的报错提示用pd.concat,大概率不是真的需要用concat,而是以下两个常见问题导致merge失败:
- 字段名大小写不匹配:你的代码里用了
Check_Number,但原数据集的字段是Check_number(下划线后是小写n),字段名完全一致才能正常关联。 - 连接字段数据类型不统一:
Date可能是字符串格式不一致(比如'2023-10-01'vs'10/01/2023'),或者Check_number一个是整数一个是字符串,都会导致merge匹配失败。
二、正确的pd.merge步骤
先统一字段名和数据类型,再分别合并四个数据集:
- 统一字段名:确保所有数据集的连接字段名完全一致(比如全部改为
Check_number) - 标准化数据类型:
# 将所有数据集的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) - 执行左连接合并:
# 合并大桌变更前数据 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']) - 处理合并后的空值:
由于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
相关产品推荐
相关产品推荐

