2017-03-15 1 views
4

왼쪽과 오른쪽의 키 인덱스가 다르면 pandas merge 메서드가 이상한 작업을하는 것을 발견했습니다. 인스턴스에 대한왼쪽과 오른쪽 df의 키가 다르면 pandas merge가 이상한 일을합니다

, 나는,

0 1 2 3 4 5 
0 1 2 3 4 5 6 
1 1 2 3 4 5 7 
2 2 3 4 5 6 7 
3 2 3 4 5 6 8 

0 1 2 3 4 5 
0 1 2 1 2 3 4 
1 2 3 2 3 4 5 
2 1 2 3 4 5 6 
3 2 2 4 5 6 7 
4 2 3 5 6 7 8 

left_df right_df을 따라 몇 가지 매개 변수를 사용하여 작업을 병합처럼 왼쪽과 오른쪽 dataframes 정의합니다

pd.merge(left_df, right_df, how="inner", left_on = [0,1], right_on=[0,1], indicator=False) 

결과가 예상대로 발견됩니다.

 0 1 2_x 3_x 4_x 5_x 2_y 3_y 4_y 5_y 
    0 1 2 1 2 3 4 3 4 5 6 
    1 1 2 1 2 3 4 3 4 5 7 
    2 1 2 3 4 5 6 3 4 5 6 
    3 1 2 3 4 5 6 3 4 5 7 
    4 2 3 2 3 4 5 4 5 6 7 
    5 2 3 2 3 4 5 4 5 6 8 
    6 2 3 5 6 7 8 4 5 6 7 
    7 2 3 5 6 7 8 4 5 6 8 

그러나 left_on 및 right_on 매개 변수를 다르게 설정하면 결과가 아래와 같이 매우 이상하게 변합니다.

merge job with '1,2' left key index 

pd.merge(left_df, right_df, how="inner", left_on = [1,2], right_on=[0,1], indicator=False) 


    1 2 0_x 1_x 2_x 3_x 4_x 5_x 0_y 1_y 2_y 3_y 4_y 5_y 
0 2 3 1 2 3 4 5 6 2 3 4 5 6 7 
1 2 3 1 2 3 4 5 6 2 3 4 5 6 8 

       ^^    ^^
       these columns are duplicated. 

    0_x 1 2 3_x 4_x 5_x 2_y 3_y 4_y 5_y 
0 1 2 3 4 5 6 4 5 6 7 
1 1 2 3 4 5 6 4 5 6 8 
this is what I expected. (keys of each df are removed.) 

위의 이상한 일을 해결할 수있는 매개 변수 또는 방법이 있습니까?

답변

0

이상한 결과가 나왔다는 생각이 들었습니다. 그래서 나는 내 가정을 두 가지 경우로 나눕니다.

  • 각 키의 컬럼 이름이 다른
  • (이 경우, 데이터 프레임의 절대 열 위치). 열 인덱스 각 키의 일부 저자

다른 테스트 케이스, 내가 알아낼 수 각 키의 열 이름이 다를 때 결과가 좋지 않습니다.

이 문제는 쉽게 열 이름을 chaning 처리 할 수 ​​있습니다.

left_df 
    0 key0 key1 3 4 5 
0 1  2  1 2 3 4 
1 2  3  2 3 4 5 
2 1  2  3 4 5 6 
3 2  2  4 5 6 7 
4 2  3  5 6 7 8 

right_df 
    key0 key1 2 3 4 5 
0  1  2 3 4 5 6 
1  1  2 3 4 5 7 
2  2  3 4 5 6 7 
3  2  3 4 5 6 8 

result 
    0 key0 key1 3_x 4_x 5_x 2 3_y 4_y 5_y 
0 1  2  3 4 5 6 4 5 6 7 
1 1  2  3 4 5 6 4 5 6 8 

그리고 아래는 간단한 코드 구현입니다.

 key_entry = [] 
     for i in range(len([1,2])): 
      key_entry.append('key' + str(i)) 

     left_rename_map = {} 
     for i, each in zip([1,2], key_entry): 
      left_rename_map[i] = each 

     right_rename_map = {} 
     for i, each in zip([0,1], key_entry): 
      right_rename_map[i] = each 

     df1 = df1.rename(columns=left_rename_map) 
     df2 = df2.rename(columns=right_rename_map) 

제 생각에 팬더는 모든 열 정보 (이 경우 열 이름)를 저장하려고합니다. 따라서 키의 열 이름이 다른 경우 Pandas는 모든 값이 동일하지만 열이 동일하지 않으며 키 열을 제거하지 않는다고 생각합니다.

관련 문제