2017-04-10 2 views
1

인덱스 당 하나의 행만 유지하는 멀티 인덱스 데이터 프레임을 필터링하는 방법을 생각할 수 없습니다. PD로 NP 수입 팬더와 같은 수입 임의 수입 NumPy와각 멀티 인덱스 팬더 데이터 프레임에 대해 최소값 가져 오기

A = np.array(['ID1', 'ID1', 'ID2', 'ID3', 'ID3', 'ID3', 'ID4', 'ID4']) 
B = np.array([1, 2, 2, 5, 3, 7, 12, 9]) 
C = np.array([1,2,3,4,5,6,7,8]) 
D = list('abcdefgh') 

df1 = pd.DataFrame(zip(A, B, C, D), columns=['ID', 'trial', 'C', 'D']) 
df1.set_index(['ID', 'trial'], inplace=True) 

a = np.array(['ID2', 'ID3', 'ID4']) 
b = np.array([2,2,11]) 
df2 = pd.DataFrame(zip(a,b), columns = ['sub', 'attempt']) 

DF1 :

  C D 
ID trial  
ID1 1  1 a 
    2  2 b 
ID2 2  3 c 
ID3 5  4 d 
    3  5 e 
    7  6 f 
ID4 12  7 g 
    9  8 h 

DF2 : 여기

내 데이터이다

sub attempt 
0 ID2  2 
1 ID3  2 
2 ID4  11 

그리고 나는 것 df1에서 유지하는 것처럼 데이터 th 만 '시도'의 상태로 DF2 일치에 df1.trial이 df2.attempt하기가 가장 가까운 값을 가진 행을 유지해야합니다

  C D 
ID trial  
ID2 2  3 c 
ID3 3  5 e 
ID4 12  7 g 

내가 많은과 (정말 더러운 방법을 발견 반복 "에 대한" ...),하지만 더 아름다운 뭔가가있는 것처럼 느껴집니다.

내가하고 싶은 또 다른 것은, DF1 각 multiindex의 첫 번째 행을 유지하는 것입니다 : 그러나 여기

  C D 
ID trial  
ID1 1  1 a 
ID2 2  3 c 
ID3 5  4 d 
ID4 12  7 g 

, 난 단지 다른 하나를 만들어, 더러운 코드를 얻을.

도움 주셔서 감사합니다.

답변

0
s = df2['sub'] 
idx = pd.Series(
    df1.index.get_level_values('trial'), 
    df1.index 
).groupby(level=0).idxmin() 
df1.loc[idx].query('ID in @s') 

      C D 
ID trial  
ID2 2  3 c 
ID3 3  5 e 
ID4 9  8 h 
+0

답장을 보내 주셔서 감사합니다. 첫 번째 방향을 알려줍니다. 그러나 내 경우에는 'C'또는 'D'열이 반드시 주문 된 것은 아니므로 이것이 첫 번째 선을 원하는 이유입니다. 'C'와 'D'는 정수 나 문자열이 아니라 객체 일 수 있습니다. – POINTEAG

+0

업데이트 된 답변 @POINTEAG – piRSquared

관련 문제