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

如何对维度相同且含重复行的两个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]
})

方法一:通过索引映射快速匹配相乘

这是效率较高的方式,适合数据量较大的场景:

  1. 统一Key列名并设置索引:先把Df2的Key_1改成和Df1一致的Key,再将Key设为索引,方便快速通过Key定位对应数值行
    df2 = df2.rename(columns={'Key_1': 'Key'}).set_index('Key')
    
  2. 提取数值列并执行匹配相乘:筛选出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)
    
  3. 合并结果列与原始非数值列:把计算后的数值列和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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 22:39:06