
本文详解如何将通过 pd.merge() 合并的两个 dataframe 正确导出为 excel 文件(.xlsx),包括关键步骤:统一主程序入口、保存合并结果、避免重复定义与作用域错误,并提供可直接运行的完整示例代码。
本文详解如何将通过 pd.merge() 合并的两个 dataframe 正确导出为 excel 文件(.xlsx),包括关键步骤:统一主程序入口、保存合并结果、避免重复定义与作用域错误,并提供可直接运行的完整示例代码。
在使用 Pandas 处理多源数据时,常需将来自不同来源(如不同网页、数据库或 CSV)的 DataFrame 按指定列(如唯一标识字段)进行合并,再统一导出为 Excel 供后续分析或汇报。初学者容易陷入两个常见误区:一是误用多个独立的 if __name__ == "__main__": 块导致变量作用域隔离;二是未将 pd.merge() 的返回结果显式赋值给新变量,从而无法调用 .to_excel() 方法。
核心要点如下:
✅ 必须将合并结果赋值给变量(如 df_merged = pd.merge(...)),否则仅打印输出无法保存;
✅ 所有数据处理逻辑应置于同一个 if __name__ == "__main__": 块中,确保 df 和 df2 在同一作用域内可被访问;
✅ .to_excel() 直接作用于合并后的 DataFrame,语法与单个 DataFrame 完全一致,无需额外配置(除非需多表、样式等高级功能);
✅ 推荐添加 index=False 参数,避免将行索引写入 Excel,保持表格更简洁专业。
以下是整合优化后的关键代码段(已移除冗余、修复逻辑冲突,并增强可读性):
if __name__ == "__main__":
# --- 第一个数据源:哥伦比亚联赛 ---
df = pd.DataFrame(_get_rows(matchlink))
df[['home', 'away']] = df['match'].str.split("-", expand=True)
df[['scorehome', 'scoreaway']] = df['result'].str.split(":", expand=True)
df = df.astype({'scorehome': 'int', 'scoreaway': 'int'})
df['campionato'] = "Chi-A"
df['sum_stats'] = df[['scorehome', 'scoreaway']].sum(axis=1)
df['over05'] = np.where(df['sum_stats'] > 0, 'OK', 'NO')
df['goal'] = np.where((df['scorehome'] >= 1) & (df['scoreaway'] >= 1), 'OK', 'NO')
df['esito'] = ['1' if h > a else '2' if h < a else 'X'
for h, a in zip(df['scorehome'], df['scoreaway'])]
df['result'] = df['result'].str.replace(':', '-')
df['uniquefield'] = df[['home', 'away', 'result']].apply(lambda r: ' '.join(r.astype(str)), axis=1)
df = df[['home', 'away', 'scorehome', 'scoreaway', 'result', 'best_bets', 'oddtwo', 'oddthree',
'sum_stats', 'over05', 'goal', 'esito', 'campionato', 'uniquefield']]
df = df.sort_values('best_bets')
# --- 第二个数据源:智利联赛 ---
df2 = pd.DataFrame(_get_rows(matchlink2))
df2[['home', 'away']] = df2['match'].str.split("-", expand=True)
df2[['htresult', 'shresult']] = df2['htftresult'].str.split(",", expand=True)
df2['htresult'] = df2['htresult'].str.strip('()')
df2['shresult'] = df2['shresult'].str.strip('()')
df2['campionato'] = "Chi-A"
df2['result'] = df2['result'].str.replace(':', '-')
df2['uniquefield2'] = df2[['home', 'away', 'result']].apply(lambda r: ' '.join(r.astype(str)), axis=1)
df2 = df2[['home', 'away', 'htresult', 'shresult', 'result', 'campionato', 'uniquefield2']]
# --- 合并并导出 ---
df_merged = pd.merge(df, df2, left_on='uniquefield', right_on='uniquefield2', how='left').drop('uniquefield2', axis=1)
# ✅ 关键:将合并结果保存为 Excel
file_name = 'BexData.xlsx'
df_merged.to_excel(file_name, index=False) # 推荐 index=False
print(f"✅ 合并后的 {len(df_merged)} 行数据已成功导出至 '{file_name}'")注意事项与最佳实践:
- ? 检查合并键有效性:确保 uniquefield 与 uniquefield2 确实能准确匹配(建议先用 df_merged.isna().sum() 查看缺失值,判断是否需调整 how= 参数为 'inner' 或 'outer');
- ? 路径与权限:若导出失败,请确认当前工作目录有写入权限,或使用绝对路径(如 r"C:\Reports\BexData.xlsx");
- ? 扩展需求:如需将 df 和 df2 分别写入 Excel 的不同 Sheet,可使用 pd.ExcelWriter;
- ⚠️ 函数重名警告:原代码中两个 _get_rows() 函数定义在同一作用域会引发覆盖(第二个覆盖第一个)。本方案已通过分步调用不同 URL规避该问题,实际开发中建议为函数命名更具区分度(如 _get_colombia_data() / _get_chile_data())。
掌握这一流程后,无论合并 2 个还是多个 DataFrame,导出 Excel 都只需一行 .to_excel() —— 清晰、稳定、符合生产级代码规范。










