如何对不同列的Pandas DataFrame进行类Zip方式的相加操作
实现类Zip的DataFrame相加操作(笛卡尔积后列计算)
你想要的其实是先对两个DataFrame做笛卡尔积组合,再基于原列进行指定的相加计算,完全不用逐行循环处理,用Pandas的内置方法就能高效实现。
步骤详解
构建示例数据
先把你的示例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]})笛卡尔积合并
用merge(how='cross')实现两个DataFrame的全量组合(也就是你说的类Zip的配对方式):df_combined = df1.merge(df2, how='cross')这一步会自动把df1的每一行和df2的每一行进行配对,得到4行数据,正好对应你期望的行数。
调整列与计算目标值
接下来按照你的期望结果调整列:- 保留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']) # 删掉中间冗余列- 保留df1的
调整列顺序
最后把列调整成你期望的顺序: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
相关产品推荐
相关产品推荐

