Pandas - 合并 DataFrame,在公共列上保留非空值,在另一列上保持平均值

问题描述 投票:0回答:1

我正在使用两个

DataFrames
,定义如下:

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'])

df1

id  name   similarity
1   a      0.95
2   b      0.92
3   c      0.91

df2

id  name   similarity
3   c      0.93
4   d      0.92
5   e      0.99

我现在想通过键属性

DataFrames
组合两个
id
,同时避免在
NaN
列中创建
name
。为此,我使用
pd.combine_first
,如这个答案中的建议,得到这个:

df3 = df1.set_index('id').combine_first(df2.set_index('id'))
df3

id  name   similarity   
1   a      0.95
2   b      0.92
3   c      0.91
4   d      0.92
5   e      0.99

但是,我还有一个额外的要求。当两个集合上都存在

similarity
值时,我想将它们的平均值作为新值。例如,我想要的输出是这样的:

id  name  similarity    
1   a      0.95
2   b      0.92
3   c      0.92 <-- (0.91 + 0.93 / 2)
4   d      0.92
5   e      0.99

最好使用

pandas
numpy
,当两个 DataFrames 都有值时,我如何平均相似度?

python pandas dataframe
1个回答
0
投票

你可以

concat
,然后
groupby.mean
:

out = pd.concat([df1, df2]).groupby(['id', 'value'], as_index=False).mean()

输出:

   id value  similarity
0   1     a        0.95
1   2     b        0.92
2   3     c        0.92
3   4     d        0.92
4   5     e        0.99
© www.soinside.com 2019 - 2024. All rights reserved.