基于变量名相同后缀循环合并多个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完全匹配的行,空结果说明对应表的这两个列没有共同组合值,按以下步骤排查:- 检查列值是否有重叠
打印对应表的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()) - 检查列的数据类型是否一致
若一个表的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
相关产品推荐
相关产品推荐

