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

如何基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 16:35:13