如何基于3个共同列合并3个DataFrame?
看起来你犯了两个关键错误——一是merge的关联列参数完全写错了(你把left_on设成Date,right_on设成Product,这根本不是基于共同列的匹配逻辑),二是没处理共同列的数据类型不一致问题。别担心,咱们一步步解决这个多DataFrame合并的问题:
第一步:统一共同列的数据类型
先解决报错里的类型不匹配问题,你需要确保三个DataFrame的Date、Plant、Product列类型完全一致。比如把所有Date列转成datetime类型,Plant和Product转成字符串:
import pandas as pd # 批量统一三个DataFrame的共同列类型 for df in [df_1, df_2, df_3]: df['Date'] = pd.to_datetime(df['Date']) df['Plant'] = df['Plant'].astype(str) df['Product'] = df['Product'].astype(str)
第二步:基于多共同列合并多个DataFrame
因为你有三个DataFrame,我们可以用两种方法实现合并,都能保留所有不匹配的行(符合你不想用concat的需求):
方法1:分步合并(直观易懂)
先合并df_1和df_2,再把结果和df_3合并,始终基于三个共同列:
# 第一步:合并df_1和df_2 df_temp = pd.merge( df_1, df_2, how='outer', # 保留所有行,包括不匹配的 on=['Date', 'Plant', 'Product'] # 指定三个共同列作为匹配键 ) # 第二步:合并临时结果和df_3 final_df = pd.merge( df_temp, df_3, how='outer', on=['Date', 'Plant', 'Product'] )
方法2:用reduce批量合并(简洁高效)
如果以后要合并更多DataFrame,这个方法更省心:
from functools import reduce # 把所有要合并的DataFrame放进列表 dfs_list = [df_1, df_2, df_3] # 用reduce批量执行合并逻辑 final_df = reduce( lambda left_df, right_df: pd.merge( left_df, right_df, how='outer', on=['Date', 'Plant', 'Product'] ), dfs_list )
第三步:调整最终列顺序(可选)
如果你需要严格按照Date Plant Product Column1 Column2 Column3的顺序展示,可以手动调整:
final_df = final_df[['Date', 'Plant', 'Product', 'Column1', 'Column2', 'Column3']]
为啥你之前的代码会报错?
你之前的merge参数left_on='Date'和right_on='Product'是在把df_1的Date列(datetime类型)和df_2的Product列(object类型)强行匹配,类型完全不兼容,所以触发了报错。而且这也完全偏离了你基于三个共同列合并的需求。
内容的提问来源于stack exchange,提问作者Triz
相关产品推荐
相关产品推荐

