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
相关产品推荐
相关产品推荐

