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

如何在两个DataFrame间执行指定运算:匹配项算比值,无匹配项填0

计算两个DataFrame共同元素的count比值,其余填0

这是个很常见的DataFrame匹配计算需求,我给你两种简洁的实现方法,都能完美得到你想要的结果:

方法一:用Merge合并后计算(直观易懂)

这种方法通过左连接保留df1的所有行,匹配df2中存在的id,然后计算比值,最后把未匹配到的项填充为0。

import pandas as pd

# 先构建你的示例数据
df1 = pd.DataFrame({'id': [5, 3, 7, 2], 'count': [124, 136, 12, 345]})
df2 = pd.DataFrame({'id': [5, 7], 'count': [65, 3]})

# 重命名df2的count列,避免合并后列名冲突
df2_renamed = df2.rename(columns={'count': 'count_df2'})

# 左连接两个DataFrame,保留df1的所有行
merged_df = df1.merge(df2_renamed, on='id', how='left')

# 计算比值,未匹配到的项会得到NaN,用fillna(0)替换成0
merged_df['count'] = merged_df['count'].div(merged_df['count_df2']).fillna(0)

# 保留需要的列,并且保留两位小数和示例一致
df3 = merged_df[['id', 'count']].round(2)
print(df3)

运行后输出和你的预期完全一致:

id  count
0   5   1.91
1   3   0.00
2   7   4.00
3   2   0.00

方法二:用Map映射计算(简洁高效)

如果只需要单列的匹配映射,用字典映射的方式会更高效,代码也更简洁:

import pandas as pd

df1 = pd.DataFrame({'id': [5, 3, 7, 2], 'count': [124, 136, 12, 345]})
df2 = pd.DataFrame({'id': [5, 7], 'count': [65, 3]})

# 把df2转换成id到count的映射系列
df2_count_map = df2.set_index('id')['count']

# 用map获取每个id对应的df2 count值,然后计算比值,NaN填充为0
df1['count'] = df1['count'].div(df1['id'].map(df2_count_map)).fillna(0).round(2)

df3 = df1
print(df3)

两种方法的适用场景

  • Merge方法:适合需要同时匹配多列数据,或者后续还要做更多数据处理的场景,逻辑清晰,可读性强。
  • Map方法:适合只需要单列映射的简单场景,代码更短,执行效率更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:36:13