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
相关产品推荐
相关产品推荐

