2017-12-20 1 views
1

2 개의 데이터 프레임을 고려하고 2 개의 고유 한 열 (idA, idB)로 2 개의 데이터 프레임을 결합하고 col 거리의 합계를 계산해야합니다. . 그 거리가 가산되어야하므로 방법 (IDA, IDB)에 의해, (IDB, IDA)로 동일한 산출이 방법이어야 여러 열에 2 개의 데이터 프레임 결합하기 Pandas

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를 사용하여 그것을하는 방법.

+0

, 당신은 먼저 각 데이터 프레임을 정렬 할 수 있습니다 업데이트되었습니다. – Tai

답변

2

모두 열를 숫자 다음 정렬을 위해 set_indexadd를 사용하여 행 당 컬럼의 각 쌍을 정렬하는 첫 번째 변환 :

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 

집계 sumconcatgroupby 또 다른 솔루션 :

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 
2
df1.Distance=pd.to_numeric(df1.Distance) 
df2.Distance=pd.to_numeric(df2.Distance) 
df=pd.concat([df1.assign(key=df1.idA+df1.idB),df2.assign(key=df2.idA+df2.idB)]).\ 
    groupby('key').agg({'Distance':'sum','idA':'first','idB':'first'}) 
df 
Out[672]: 
    Distance idA idB 
key      
2 0.727273 1 1 
3 1.037273 2 1 
6 3.927273 2 4 
11 0.127273 3 8 
12 0.800000 5 7 

나는 당신의 특별한 사용 사례에 생각

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

pd.concat([df1,df2]).groupby(['idA','idB'],as_index=False).Distance.sum() 
Out[678]: 
    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 
+0

코드를 실행하여 결과가 달라집니다. 첫 번째 예제에서는 idA와 idB를 숫자로 변환하는 것으로 보입니다. 그러나 7 + 3 = 8 + 2이므로 잘못 될 것입니다. (7, 3)의 거리는 (8, 2)의 거리와 달라야하지만 함께 그룹화하십시오. @wen – Tai

+0

@ TaiLinWu Jaz의 답변을 사용할 수 있습니다. – Wen

관련 문제