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

如何对不同列的Pandas DataFrame进行类Zip方式的相加操作

实现类Zip的DataFrame相加操作(笛卡尔积后列计算)

你想要的其实是先对两个DataFrame做笛卡尔积组合,再基于原列进行指定的相加计算,完全不用逐行循环处理,用Pandas的内置方法就能高效实现。

步骤详解

  1. 构建示例数据
    先把你的示例DataFrame创建出来:

    import pandas as pd
    
    df1 = pd.DataFrame({'X': [1, 1], 'a': [1, 2], 'b': [2, 3]})
    df2 = pd.DataFrame({'X': [1, 2], 'c': [1, 2]})
    
  2. 笛卡尔积合并
    用merge(how='cross')实现两个DataFrame的全量组合(也就是你说的类Zip的配对方式):

    df_combined = df1.merge(df2, how='cross')
    

    这一步会自动把df1的每一行和df2的每一行进行配对,得到4行数据,正好对应你期望的行数。

  3. 调整列与计算目标值
    接下来按照你的期望结果调整列:

    • 保留df1的X值
    • 保留df1的a值
    • 把df2的c作为新的b列
    • 新的c列是原df1的b加上df2的c

    用assign()做向量化计算(比逐行循环快N倍):

    result = df_combined.assign(
        X=df_combined['X_x'],  # 保留df1的X值
        b=df_combined['c'],    # 替换b为df2的c
        c=df_combined['b_x'] + df_combined['c']  # 计算原b与c的和
    ).drop(columns=['X_x', 'X_y', 'b_x'])  # 删掉中间冗余列
    
  4. 调整列顺序
    最后把列调整成你期望的顺序:

    result = result[['X', 'a', 'b', 'c']]
    

最终结果

运行后得到的result就是你想要的:

X  a  b  c
0  1  1  1  3
1  1  1  2  4
2  1  2  1  4
3  1  2  2  5

补充说明

如果你的需求是仅按X值匹配后做组合(比如只让df1和df2中X相同的行配对),只需要把合并方式改成按X关联:

df_combined = df1.merge(df2, on='X')

不过这种方式下,因为df1只有X=1的行,df2中X=2的行会被过滤掉,最终只会得到2行数据,不符合你的期望结果,所以用全量笛卡尔积的方式更适合你的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:24:02