我有两个数据框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))