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

如何基于ConnectionID匹配两个DataFrame的Value列并相乘?

问题描述

现有两个DataFrame:

priority DataFrame

print(priority)
ConnectionID Value
1     CN01491920     2
3     CN01491922     2
5     CN01491931     1
7     CN01491928     2
9     CN01491935     2
..           ...   ...
589   CN01493318     1
591   CN01493288     1
593   CN01493307     1
595   CN01493322     2
597   CN01493321     2

[299 rows x 2 columns]

client DataFrame

print(client)
   ConnectionID  Value
0    CN01493292   1400
1    CN01493278    864
2    CN01493318    616
3    CN01493346    413
4    CN01492425    412
5    CN01493307    211
6    CN01492290    111
7    CN01492933    106
8    CN01493112     96
9    CN01492697     94
10   CN01492209     93
11   CN01493277     93
12   CN01492456     93
13   CN01493259     93
14   CN01493342     93
15   CN01492533     93
16   CN01491983     93
17   CN01492705     93
18   CN01492417     93
19   CN01492828     93
20   CN01493321     93
21   CN01492218     93
22   CN01492297     93
23   CN01492145     93
24   CN01492142     93
25   CN01492147     93
26   CN01493007     93
27   CN01492221     93
28   CN01492374     93
29   CN01493377     93
30   CN01492713     93
31   CN01493010     93
32   CN01491970     93
33   CN01492556     93
34   CN01492822     93
35   CN01492044     93
36   CN01492841     93
37   CN01493280     93
38   CN01492175     93
39   CN01492782     93
40   CN01493015     93
41   CN01492214     93
42   CN01493098     89
43   CN01493026     89
44   CN01493290     84
45   CN01492618     80
46   CN01493014     77
47   CN01492848     76
48   CN01491931     68
49   CN01492513     60
50   CN01492910     49
51   CN01493260     33
52   CN01492277     25
53   CN01492229     17
54   CN01493053     13
55   CN01492672      9
[55 rows x 2 columns]

需求:当client['ConnectionID']与priority['ConnectionID']匹配时,将client['Value']与priority['Value']相乘;若priority中的ConnectionID未在client中找到,则忽略该条操作,最终将结果存入新DataFrame。

尝试的嵌套循环代码无法正常运行:

for i in range(len(client)):
   for j in range(len(priority)):
       if(client['ConnectionID'].loc[i]==priority['ConnectionID'].loc[j]):
           client['Multiplication'] = client['Value'].loc[i]*priority['Value'].loc[j]

请问有没有简洁的实现方法?


解决方案

用Pandas的merge方法可以高效实现需求,无需嵌套循环,步骤如下:

  1. 重命名两个DataFrame的Value列,避免合并后列名冲突
  2. 以ConnectionID为键做左连接,只保留client中存在的记录
  3. 计算两列的乘积,自动忽略不匹配的记录(结果为NaN)
  4. 按需过滤或保留记录,生成最终结果DataFrame

具体代码:

# 重命名Value列,避免合并后重名
priority_renamed = priority.rename(columns={'Value': 'Priority_Value'})
client_renamed = client.rename(columns={'Value': 'Client_Value'})

# 左连接,只保留client中的所有ConnectionID记录
merged_df = client_renamed.merge(priority_renamed, on='ConnectionID', how='left')

# 计算乘积,不匹配的记录会得到NaN
merged_df['Multiplication'] = merged_df['Client_Value'] * merged_df['Priority_Value']

# 过滤掉无匹配的记录(可选,若需要保留所有client记录则跳过此步)
result_df = merged_df.dropna(subset=['Multiplication']).copy()

# 若要保留原始列结构,可选择指定列输出
# result_df = merged_df[['ConnectionID', 'Client_Value', 'Priority_Value', 'Multiplication']]

说明

  • merge(how='left')确保只保留client的全部记录,未匹配到priority的记录对应的Priority_Value会显示为NaN
  • 相乘操作会自动处理NaN,结果仍为NaN;如果不需要这些无匹配的记录,用dropna即可过滤
  • 这种方法比嵌套循环效率高得多,尤其适合处理行数较多的DataFrame

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 01:40:30