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

Pandas合并DataFrame:公共列留非空值,similarity列取平均值

解决方案

这里有几种简洁的Pandas实现方式,能满足你的需求:

方法一:外连接合并后处理列

先通过outer merge按id合并两个DataFrame,再分别处理value和similarity列:

import pandas as pd

df1 = pd.DataFrame([[1, 'a', 0.95], [2, 'b', 0.92], [3, 'c',  0.91]], columns=['id','value','similarity'])
df2 = pd.DataFrame([[3, 'c', 0.93], [4, 'd', 0.92], [5, 'e',  0.99]], columns=['id','value','similarity'])

# 外连接合并,用后缀区分两个表的列
merged = pd.merge(df1, df2, on='id', how='outer', suffixes=('_df1', '_df2'))

# 处理value列:取任意非空值(同id的value在两个表中一致,直接用combine_first补全)
merged['value'] = merged['value_df1'].combine_first(merged['value_df2'])

# 处理similarity列:两值都存在则取平均,单值则保留原数
merged['similarity'] = merged[['similarity_df1', 'similarity_df2']].mean(axis=1)

# 保留目标列并整理结果
result = merged[['id', 'value', 'similarity']].sort_values('id').reset_index(drop=True)
print(result)

输出结果:

id value  similarity
0   1     a        0.950
1   2     b        0.920
2   3     c        0.920
3   4     d        0.920
4   5     e        0.990

方法二:堆叠后分组聚合

把两个DataFrame堆叠到一起,按id分组后对不同列用对应聚合逻辑:

import pandas as pd

df1 = pd.DataFrame([[1, 'a', 0.95], [2, 'b', 0.92], [3, 'c',  0.91]], columns=['id','value','similarity'])
df2 = pd.DataFrame([[3, 'c', 0.93], [4, 'd', 0.92], [5, 'e',  0.99]], columns=['id','value','similarity'])

# 堆叠两个DataFrame
combined = pd.concat([df1, df2])

# 按id分组聚合:value取第一个非空值,similarity取平均值
result = combined.groupby('id').agg(
    value=('value', 'first'),
    similarity=('similarity', 'mean')
).reset_index()

print(result)

这个方法更简洁,因为同id的value在两个表中一致,用first就能直接拿到非空值;similarity直接取分组平均值,自动处理单值和多值的情况。

补充说明

如果同id的value列在两个表中可能不一致,你可以调整聚合逻辑,比如用lambda x: x.iloc[0]优先取df1的值,或者沿用combine_first的补全逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 08:07:45