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

Python中如何按日期匹配将行数据转为新列合并到指定DataFrame

你遇到的列重复问题核心是多次merge时未提前对非主键列重命名,导致同名字段冲突,而且9家公司逐次merge的写法效率低易出错,推荐以下两种解决方案:

方案1:全量数据透视(更适合多公司场景,无需逐个处理)

直接对原始全量数据集做行列转换,一次生成所有公司的特征列,不管是3家还是9家公司都可通用,完全避免列名冲突问题:

import pandas as pd

# 假设原始全量数据集为df
# 1. 透视转换为宽表,日期无匹配的字段默认填充0
df_wide = df.set_index(['date', 'd']).unstack(fill_value=0)
# 2. 合并多级列名为「特征_公司名」格式,如a_x、b_y
df_wide.columns = [f"{feature}_{company}" for feature, company in df_wide.columns]
df_wide = df_wide.reset_index()

# 3. 仅保留x公司有数据的日期,匹配得到最终结果
df_result = df_x[["date"]].merge(df_wide, on="date", how="left")

方案2:逐次merge前提前重命名列(适合需要单独处理个别公司的场景)

每次merge其他公司数据前,先把对应公司的特征列加上公司后缀,再做合并即可避免重名:

# 处理y公司数据
df_y = df[df["d"] == "y"].rename(columns={"a":"a_y", "b":"b_y", "c":"c_y"})
df_x = df_x.merge(df_y[["date", "a_y", "b_y", "c_y"]], on="date", how="left").fillna(0)

# 处理z公司数据
df_z = df[df["d"] == "z"].rename(columns={"a":"a_z", "b":"b_z", "c":"c_z"})
df_x = df_x.merge(df_z[["date", "a_z", "b_z", "c_z"]], on="date", how="left").fillna(0)

# 其余公司按相同逻辑处理即可

原代码问题说明

你之前的写法在第一次merge时,suffixes=['_x', '_y']只会给当次merge的同名字段加后缀,第二次merge时df_z的a/b/c字段和df_x里已有的x公司a/b/c字段重名,suffixes第一个参数设为空,就会出现列重复或原有字段被覆盖的问题,提前统一重命名就能避免。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 15:15:03