如何在两个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
相关产品推荐
相关产品推荐

