如何计算两个DataFrame多行多列的行和差值并生成新DataFrame
实现方案:计算两个DataFrame行求和的差值矩阵
我来给你一个用Pandas实现的简洁方案,完全满足你的需求:
步骤1:准备数据并计算每行的求和值
首先我们先构造你给出的两个DataFrame,然后分别计算每行的UV、VIOLET、BLUE三列的总和:
import pandas as pd # 构造df1 df1 = pd.DataFrame({ 'WAV': ['sD1', 'sA4', 'sA1', 'sC2', 'sC3'], 'UV': [10.8, 6.2, 8.3, 7.9, 10.7], 'VIOLET': [10.1, 8.2, 11.7, 8.2, 9.5], 'BLUE': [23.5, 19.9, 28.6, 31.0, 18.1] }) # 构造df2 df2 = pd.DataFrame({ 'ID': ['D1', 'D2', 'D3', 'D4', 'D5'], 'UV': [7.9, 7.0, 21.4, 10.3, 21.7], 'VIOLET': [10.1, 9.2, 20.7, 8.9, 16.5], 'BLUE': [19.3, 15.9, 27.4, 20.9, 21.3] }) # 计算df1每行的总和,索引设为WAV列 df1_sum = df1.set_index('WAV').sum(axis=1) # 计算df2每行的总和,索引设为ID列 df2_sum = df2.set_index('ID').sum(axis=1)
步骤2:生成差值矩阵
利用Pandas的广播特性,我们可以轻松计算df2每行总和与df1每行总和的差值,生成目标DataFrame:
# 计算差值:df2的每个行总和 减去 df1的每个行总和 diff_matrix = pd.DataFrame( df2_sum.values.reshape(-1, 1) - df1_sum.values, index=df2_sum.index, columns=df1_sum.index ) # 如果需要将列名改为你期望的格式(比如sum(D1)-sum(sD1)),可以执行以下代码: diff_matrix.columns = [f"sum({row_id})-sum({col})" for col in diff_matrix.columns] # 注:如果要让列名完全匹配每行的ID(比如D1行的列名是sum(D1)-sum(sD1)),DataFrame的固定列名特性无法实现,但可以通过输出时的格式化来展示,或者保持列名为df1的WAV值,这样更符合数据结构规范
最终结果
执行完上述代码后,diff_matrix就是你想要的结果。如果保持列名为df1的WAV值,结果如下:
sD1 sA4 sA1 sC2 sC3 ID D1 -14.1 -6.0 -20.7 -7.6 -10.9 D2 -19.1 -11.0 -25.7 -12.6 -15.9 D3 14.9 23.0 8.9 18.4 19.9 D4 -7.1 1.0 -13.7 -2.6 -3.9 D5 10.9 19.0 4.9 14.4 15.9
如果改成你期望的列名格式,结果会是:
sum(D1)-sum(sD1) sum(D1)-sum(sA4) sum(D1)-sum(sA1) sum(D1)-sum(sC2) sum(D1)-sum(sC3) ID D1 -14.1 -6.0 -20.7 -7.6 -10.9 D2 -19.1 -11.0 -25.7 -12.6 -15.9 D3 14.9 23.0 8.9 18.4 19.9 D4 -7.1 1.0 -13.7 -2.6 -3.9 D5 10.9 19.0 4.9 14.4 15.9
补充说明
- 这里用到的广播特性是Pandas的核心功能之一,当你用一维数组(Series)和 reshaped后的一维数组做运算时,Pandas会自动对齐维度,完成逐元素的计算,比循环每行计算高效得多。
- 如果你的数据量很大,这个方法依然能保持良好的性能,因为它基于向量运算而非逐行遍历。
内容的提问来源于stack exchange,提问作者saurus
相关产品推荐
相关产品推荐

