如何对维度相同且含重复行的两个DataFrame执行对应乘法运算?
解决DataFrame按Key匹配后数值列逐行相乘的问题
我来帮你梳理这个问题的解决思路,核心其实是按Key匹配两个DataFrame的数值行,然后逐元素相乘,你之前尝试分组没成功,大概率是没找对匹配的正确方式,咱们一步步来拆解:
首先先把你的测试数据用pandas构造出来(方便复现验证):
import pandas as pd # 构造Df1 df1 = pd.DataFrame({ 'Name': ['Abb', 'Bcc', 'Abb', 'Bcc'], 'Key': ['AB', 'BC', 'AB', 'BC'], '100': [2, 1, 5, 7], '101': [6, 3, 1, 1], '102': [10, 7, 11, 4], '103': [5, 4, 3, 5], '104': [1, 2, 1, 0] }) # 构造Df2 df2 = pd.DataFrame({ 'Key_1': ['AB', 'BC'], '100': [10, 1], '101': [2, 10], '102': [1, 2], '103': [5, 2], '104': [1, 4] })
方法一:通过索引映射快速匹配相乘
这是效率较高的方式,适合数据量较大的场景:
- 统一Key列名并设置索引:先把Df2的
Key_1改成和Df1一致的Key,再将Key设为索引,方便快速通过Key定位对应数值行df2 = df2.rename(columns={'Key_1': 'Key'}).set_index('Key') - 提取数值列并执行匹配相乘:筛选出Df1中的数值列(100-104),用
map方法给每一行匹配到Df2中对应Key的数值行,然后逐元素相乘# 筛选出需要相乘的数值列 num_cols = [col for col in df1.columns if col not in ['Name', 'Key']] # 按Key匹配后相乘 result_num = df1[num_cols].mul(df1['Key'].map(df2.loc[lambda x: x.index]), axis=0) - 合并结果列与原始非数值列:把计算后的数值列和Df1的
Name、Key列拼接,得到最终结果final_df = pd.concat([df1[['Name', 'Key']], result_num], axis=1)
方法二:先合并再逐列相乘(更直观)
如果觉得映射方式不好理解,也可以用merge先把两个DataFrame按Key合并,再逐列计算乘积,新手更容易上手:
# 按Key合并两个DataFrame,给重复列名加后缀区分 merged = df1.merge(df2.rename(columns={'Key_1': 'Key'}), on='Key', suffixes=('_df1', '_df2')) # 遍历数值列,计算对应列的乘积 for col in num_cols: merged[col] = merged[f'{col}_df1'] * merged[f'{col}_df2'] # 保留需要的列得到最终结果 final_df = merged[['Name', 'Key'] + num_cols]
两种方法运行后都会得到你预期的输出:
Name Key 100 101 102 103 104 0 Abb AB 20 12 10 25 1 1 Bcc BC 1 30 14 8 8 2 Abb AB 50 2 11 15 1 3 Bcc BC 7 10 8 10 0
为什么你之前分组操作没成功?
分组(比如df1.groupby('Key'))是把相同Key的行聚合在一起,但直接和Df2相乘会因为维度不匹配出错——分组是组级别的批量操作,而我们需要的是逐行匹配对应Key的数值行,所以分组的思路在这里并不适用,换成交互匹配的方式就解决了。
内容的提问来源于stack exchange,提问作者table_101
相关产品推荐
相关产品推荐

