根据数据框中的前两列查找重复行,并添加其第三列



我有两个数据框df1和df2,每个数据框有三列。我想根据前两列查找重复的行,并将 df1 中重复条目的第三列替换为相应重复条目中第三列的总和

简单示例

df1
col1 col2 col3
80.3    30.3    15
80.3    30.2    15
80.3    30.4    15
80.3    30      15
80.3    29.9    15
80.4    29.9    10
df2
col1 col2 col3
80.3    30.3    5
80.3    30.2    5
80.3    30.4    5
80.3    30      5
80.3    29.9    5
expected result
80.3    30.3    20
80.3    30.2    20
80.3    30.4    20
80.3    30      20
80.3    29.9    20
80.4    29.9    10

以及我应该如何在 col0.01 和 col2 中引入公差水平来查找重复项?

试试这个没有容差:

pd.concat([df1, df2]).groupby(["col1", "col2"], as_index=False)["col3"].sum()
col1  col2  col3
0  80.3  29.9    20
1  80.3  30.0    20
2  80.3  30.2    20
3  80.3  30.3    20
4  80.3  30.4    20
5  80.4  29.9    10

有关宽容,请参阅@jezrael答案。

没有公差的解concat聚合sum

df = pd.concat([df1, df2]).groupby(['col1','col2'], as_index=False, sort=False).sum()
print (df)
col1  col2  col3
0  80.3  30.3    20
1  80.3  30.2    20
2  80.3  30.4    20
3  80.3  30.0    20
4  80.3  29.9    20
5  80.4  29.9    10

具有容差的解决方案在按cut进行分箱时更复杂:

df2 = (pd.concat([df1, df2])
.assign(c1 = lambda x: pd.cut(x['col1'], 
np.arange(x['col1'].min(), 
x['col1'].max()+0.01, 0.02), right = False),
c2 = lambda x: pd.cut(x['col2'], 
np.arange(x['col2'].min(), 
x['col2'].max()+0.01, 0.02), right = False))
.groupby(['c1','c2'], sort=False)
.agg({'col1':'first', 'col2':'first', 'col3':'sum'})
.dropna()
.reset_index(drop=True))

相关内容

最新更新