如何动态合并成对DataFrame,将单元格值格式化为val1(val2)?
动态合并成对DataFrame为指定格式的新DataFrame
核心思路
利用Pandas的向量化字符串操作实现高效的单元格拼接,同时通过批量分组逻辑处理数百对DataFrame的动态配对需求。
1. 定义合并函数(处理单对DataFrame)
这个函数负责将两个维度一致的DataFrame按val1 (val2)格式合并,同时加入维度校验确保输入合法:
import pandas as pd def merge_pair(df1, df2): # 校验维度一致性 if df1.shape != df2.shape: raise ValueError("成对的DataFrame必须维度完全一致") # 向量化拼接字符串(比逐元素处理效率高10-100倍) merged_df = df1.astype(str) + ' (' + df2.astype(str) + ')' # 保留原DataFrame的列名与索引 merged_df.columns = df1.columns merged_df.index = df1.index return merged_df
处理缺失值(可选)
如果DataFrame存在NaN,可以先替换为空字符串避免拼接出nan (xxx)的结果:
def merge_pair_with_na(df1, df2): if df1.shape != df2.shape: raise ValueError("成对的DataFrame必须维度完全一致") df1_clean = df1.fillna('').astype(str) df2_clean = df2.fillna('').astype(str) merged_df = df1_clean + ' (' + df2_clean + ')' merged_df.columns = df1.columns merged_df.index = df1.index return merged_df
2. 批量处理成对DataFrame
根据你的DataFrame存储方式,选择对应的批量处理逻辑:
场景1:DataFrame按配对顺序存于列表
如果你的DataFrame是按[df1, df2, df3, df4,...]顺序两两配对的:
# 示例测试数据 df1 = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]}) df2 = pd.DataFrame({'A': [7, 8, 9], 'B': [10, 11, 12]}) df3 = pd.DataFrame({'X': [13,14], 'Y': [15,16], 'Z': [17,18]}) df4 = pd.DataFrame({'X': [19,20], 'Y': [21,22], 'Z': [23,24]}) # 所有成对DataFrame按顺序放入列表 df_list = [df1, df2, df3, df4] # 批量生成合并后的DataFrame列表 merged_dfs = [] for df_a, df_b in zip(df_list[::2], df_list[1::2]): merged_dfs.append(merge_pair(df_a, df_b)) # 查看第一个合并结果 print(merged_dfs[0])
输出结果:
A B 0 1 (7) 4 (10) 1 2 (8) 5 (11) 2 3 (9) 6 (12)
场景2:DataFrame按命名规则存于字典
如果你的DataFrame有明确配对命名(比如xxx_left和xxx_right):
from collections import defaultdict # 示例字典存储的DataFrame df_dict = { "sales_left": df1, "sales_right": df2, "inventory_left": df3, "inventory_right": df4 } # 按前缀分组配对 grouped = defaultdict(list) for name, df in df_dict.items(): prefix = name.rsplit('_', 1)[0] grouped[prefix].append(df) # 批量合并每个组内的DataFrame merged_dfs = [] for prefix, df_pair in grouped.items(): if len(df_pair) != 2: print(f"警告:分组{prefix}包含非成对数量的DataFrame,跳过") continue merged_dfs.append(merge_pair(df_pair[0], df_pair[1]))
关键注意事项
- 列顺序对齐:如果成对DataFrame列名相同但顺序不同,可在合并前统一列顺序:
df2 = df2[df1.columns] - 性能优化:向量化操作比
applymap逐元素处理效率高得多,适合大规模数据场景 - 自定义格式:如果需要调整拼接格式(比如
val1 | val2),直接修改字符串拼接部分即可
内容的提问来源于stack exchange,提问作者cer
相关产品推荐
相关产品推荐

