2017-11-08 9 views
2

내가 다음과 같이 multiindex mi을 말해봐 두 부분.병합 multiindex는

 A Test 1 Test 2 Test 3  
0 816292 0.934609 0.475035 0.822712 
1 983803 0.683858 0.025861 0.691112 
2 596573 0.493741 0.397398 0.489101 
3 199203 0.803515 0.679537 0.308588 

내가

 Serial No.    Date       Tests 
     A  B   A   B Test 1 Test 2 Test 3 
0 816292 934609 27/01/17 27/01/17 0.934609 0.475035 0.822712 
1 983803 683858 25/01/17 26/01/17 0.683858 0.025861 0.691112 
2 596573 493741 27/01/17 28/01/17 0.493741 0.397398 0.489101 
3 199203 803515 28/01/17 28/01/17 0.803515 0.679537 0.308588 

내 초기 시도 같은 것을이 두 가지를 병합 얻을 수 있도록하고 싶습니다 다음과 같이

나는, A 부분에 대한 테스트 정보를 포함하는 dataframe df이 이었습니다.

mi = mi.merge(df,left_on=('Serial No.','A'),right_on='A',how='inner') 

그러나 그 결과는 ValueError: len(right_on) must equal len(left_on). 나는 df에 추가로 열 인덱스 'Tests'를 추가하고

mi = mi.merge(df,left_on=('Serial No.','A'),right_on=('Tests','A'),how='inner') 

을하고 시도하지만 가장 쉬운 방법은 일치 df의 열을 수정하는 것입니다 KeyError: 'A'

답변

2

산출 mi :

In [11]: df 
Out[11]: 
     A Test 1 Test 2 Test 3 
0 816292 0.934609 0.475035 0.822712 
1 983803 0.683858 0.025861 0.691112 
2 596573 0.493741 0.397398 0.489101 
3 199203 0.803515 0.679537 0.308588 

In [12]: df.columns = pd.MultiIndex.from_arrays([["Serial No.", "Test", "Test", "Test"], df.columns]) 

In [13]: df 
Out[13]: 
    Serial No.  Test 
      A Test 1 Test 2 Test 3 
0  816292 0.934609 0.475035 0.822712 
1  983803 0.683858 0.025861 0.691112 
2  596573 0.493741 0.397398 0.489101 
3  199203 0.803515 0.679537 0.308588 

병합은 "그냥 작동합니다":

In [14]: df.merge(mi) 
Out[14]: 
    Serial No.  Test      Serial No.  Date 
      A Test 1 Test 2 Test 3   B   A   B 
0  816292 0.934609 0.475035 0.822712  934609 27/01/17 27/01/17 
1  983803 0.683858 0.025861 0.691112  683858 25/01/17 26/01/17 
2  596573 0.493741 0.397398 0.489101  493741 27/01/17 28/01/17 
3  199203 0.803515 0.679537 0.308588  803515 28/01/17 28/01/17 

난 그냥 목록 썼다 여기의 MultiIndex의 최상위 레벨을 생성하는 방법은 무리가있다 : 손으로

["Serial No.", "Test", "Test", "Test"] 

을 ...하지만 당신은 생성 할 수 있습니다 : 그것은 단지 목록입니다.

+0

나는 이것 또한 좋아한다. – piRSquared

+0

감사합니다. 아래 해결책을 위해 @piRSquared. 이 사람은 내가 있어야 할 곳으로 나를 데려 갔다. – Archie

1
mi.set_index(('Serial No.', 'A')).join(
    pd.concat([df.set_index('A')], axis=1, keys=['Tests']) 
).reset_index() 

    Serial No.    Date    Tests      
      A  B   A   B Test 1 Test 2 Test 3 
0  816292 934609 27/01/17 27/01/17 0.934609 0.475035 0.822712 
1  983803 683858 25/01/17 26/01/17 0.683858 0.025861 0.691112 
2  596573 493741 27/01/17 28/01/17 0.493741 0.397398 0.489101 
3  199203 803515 28/01/17 28/01/17 0.803515 0.679537 0.308588