gpt4 book ai didi

python - 在多列 Pandas 上加入 2 个数据框

转载 作者:太空宇宙 更新时间:2023-11-04 09:50:42 25 4
gpt4 key购买 nike

考虑 2 个数据帧,需要通过 2 个唯一列(idA、idB)连接 2 个数据帧,并计算它们的列距离之和.顺便说一下 (idA,idB) 等于 (idB,idA),所以他们的 Distance 必须相加

In [1]: df1 = pd.DataFrame({'idA': ['1', '2', '3', '2'],
...: 'idB': ['1', '4', '8', '1'],
...: 'Distance': ['0.727273', '0.827273', '0.127273', '0.927273']},
...: index=[0, 1, 2, 3])
...:

In [2]: df2 = pd.DataFrame({'idA': ['1', '5', '2', '5'],
...: 'idB': ['2', '1', '4', '7'],
...: 'Distance': ['0.11', '0.1', '3.0', '0.8']},
...: index=[4, 5, 6, 7])

输出必须是这样的:

    Sum_Distance    idA idB
0 0.727273 1 1
1 3.827273 2 4 <-- 2,4 = 3.0 + 2,4 = 0.827273
2 0.127273 3 8
3 1.037273 2 1 <-- 2,1 = 0.927273 + 1,2 = 0.11
4 0.1 5 1
5 0.8 5 7

帮助找到使用 Pandas/Spark 的方法。

最佳答案

首先将两列都转换为数字,然后使用 addset_index用于每行对齐和排序每对列:

df1['Distance'] = df1['Distance'].astype(float)      
df2['Distance'] = df2['Distance'].astype(float)

#if some data are not parseable convert them to NaNs
#df1['Distance'] = pd.to_numeric(df1['Distance'], errors='coerce')
#df2['Distance'] = pd.to_numeric(df2['Distance'], errors='coerce')

df1[['idA','idB']] = np.sort(df1[['idA','idB']], axis=1)
df2[['idA','idB']] = np.sort(df2[['idA','idB']], axis=1)

print (df1)
Distance idA idB
0 0.727273 1 1
1 0.827273 2 4
2 0.127273 3 8
3 0.927273 1 2

print (df2)
Distance idA idB
4 0.11 1 2
5 0.10 1 5
6 3.00 2 4
7 0.80 5 7

df3=df1.set_index(['idA','idB']).add(df2.set_index(['idA','idB']),fill_value=0).reset_index()
print (df3)
idA idB Distance
0 1 1 0.727273
1 1 2 1.037273
2 1 5 0.100000
3 2 4 3.827273
4 3 8 0.127273
5 5 7 0.800000

另一种解决方案 concatgroupby使用聚合 sum:

df3 = pd.concat([df1, df2]).groupby(['idA','idB'], as_index=False)['Distance'].sum()
print (df3)
idA idB Distance
0 1 1 0.727273
1 1 2 1.037273
2 1 5 0.100000
3 2 4 3.827273
4 3 8 0.127273
5 5 7 0.800000

关于python - 在多列 Pandas 上加入 2 个数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47908827/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com