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

基于变量名相同后缀循环合并多个DataFrame问题求助

Pandas按后缀匹配合并DataFrame后得到空结果,求助排查方法

需求场景

需要将demand_dataframe_list与supply_dataframe_list中后缀相同的DataFrame,按共同列Col1和Col2做内连接合并:
示例列表:

demand_dataframe_list = [data_Market1, data_Market2] 
supply_dataframe_list = [df_supply2_Market1, df_supply2_Market2]

目标是将data_Market1与df_supply2_Market1合并,data_Market2与df_supply2_Market2合并。

问题描述

尝试以下代码后,得到的merged_dataframes全是空DataFrame:

merged_dataframes = []

for demand_df, supply_df in zip(demand_dataframe_list, supply_dataframe_list):
    print(demand_df)
    demand_suffix = demand_df.name.split('_')[-1]  # Extract the suffix from the demand dataframe name
    supply_suffix = supply_df.name.split('_')[-1]  # Extract the suffix from the supply dataframe name
    merged_df = pd.merge(demand_df, supply_df, how="inner", on=['Col1', 'Col2'])
    merged_dataframes.append(merged_df)

排查与解决步骤

  • 先确认DataFrame的name属性是否有效
    你的代码依赖df.name提取后缀,但很多情况下创建DataFrame时不会自动设置name属性,若df.name为None或格式不符合预期,会导致后缀匹配逻辑失效。先打印验证:

    for df in demand_dataframe_list + supply_dataframe_list:
        print(f"DataFrame名称: {df.name}")
    
  • 核心排查:内连接无匹配行的原因
    内连接(how="inner")只保留两表Col1+Col2完全匹配的行,空结果说明对应表的这两个列没有共同组合值,按以下步骤排查:

    1. 检查列值是否有重叠
      打印对应表的Col1和Col2去重后的值,确认是否有交集:
      for demand_df, supply_df in zip(demand_dataframe_list, supply_dataframe_list):
          print(f"--- 对应{demand_df.name.split('_')[-1]}的匹配检查 ---")
          print("需求表的Col1/Col2组合:")
          print(demand_df[['Col1', 'Col2']].drop_duplicates())
          print("供应表的Col1/Col2组合:")
          print(supply_df[['Col1', 'Col2']].drop_duplicates())
      
    2. 检查列的数据类型是否一致
      若一个表的Col1是字符串"100",另一个是整数100,即使值看起来相同,内连接也会判定不匹配。查看列类型:
      for demand_df, supply_df in zip(demand_dataframe_list, supply_dataframe_list):
          print(f"--- {demand_df.name.split('_')[-1]}的列类型 ---")
          print("需求表:")
          print(demand_df[['Col1', 'Col2']].dtypes)
          print("供应表:")
          print(supply_df[['Col1', 'Col2']].dtypes)
      
      若类型不一致,先统一类型再合并,比如转字符串:
      demand_df['Col1'] = demand_df['Col1'].astype(str)
      supply_df['Col1'] = supply_df['Col1'].astype(str)
      # Col2同理处理
      
  • 优化后缀匹配逻辑(避免列表顺序错位)
    若担心zip依赖列表顺序的问题,可以改用字典按后缀精准匹配,避免错位合并:

    # 将DataFrame按后缀存入字典
    demand_dict = {df.name.split('_')[-1]: df for df in demand_dataframe_list}
    supply_dict = {df.name.split('_')[-1]: df for df in supply_dataframe_list}
    
    merged_dataframes = []
    # 遍历共同后缀进行合并
    for suffix in demand_dict.keys() & supply_dict.keys():
        demand_df = demand_dict[suffix]
        supply_df = supply_dict[suffix]
        # 先统一关联列类型
        for col in ['Col1', 'Col2']:
            demand_df[col] = demand_df[col].astype(str)
            supply_df[col] = supply_df[col].astype(str)
        # 执行合并
        merged_df = pd.merge(demand_df, supply_df, how="inner", on=['Col1', 'Col2'])
        merged_dataframes.append(merged_df)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 00:07:09