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

如何动态合并成对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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 18:40:08