2016-11-02 4 views
1

색인으로 ID 번호를 사용하는 큰 데이터 세트가 있습니다. 처리를 시작하기 전에 몇 가지 중복 ID를 처리해야하지만 여러 기준에 따라 수행해야합니다. 본질적으로 이 각 ID의 모든 중복 항목에서 제외되기를 원합니다.다중 기준에 중복 된 팬더 인덱스 놓기

이 예에서는 가장 최근 연도의 사본을 가져 와서 id 1을 고유하게 만들 수 있습니다. 그러나 ID 3은 여전히 ​​왼쪽 두 개의 값을 가지고, 그럼 난 다음 조건에 가고 싶어 -이 경우 우리는 최대 발 말할 것이다 :

val year 
id 
1  7 2001 
1  8 2002 
2  9 2002 
3 17 2001 
3 11 2002 
3 12 2002 
: 결과가이 어디

import pandas as pd 
data = {'id':[1, 1, 2, 3, 3, 3], 'year':[2001, 2002, 2002, 2001, 2002, 2002], 'val':[7, 8, 9, 17, 11, 12]} 
df = pd.DataFrame(data).set_index('id') 

dups = df[df.index.duplicated(keep=False)] 

for id in dups.index.unique(): 
    current = dups.loc[id] 
    max_yr = current['year'].max() 
    #continue to process using multiple conditionals inside the loop 

을 그것은 작동

val year 
id 
1  8 2002 
2  9 2002 
3 12 2002 

,하지만 매우 비효율적이고 벡터화 또는 적어도 더 좋은 방법이 작업을 수행 할 수있는가 있어야합니다 같은 느낌 :

이 변합니다. groupby를 통합 할 수는 있지만 그룹을 반복하지 않고도 어떻게 수행 할 것인지 확실하지 않습니다.

+0

당신은 다음과 같습니다 :'df.groupby (level = 0) .max()'? – MaxU

+0

아니요, 여러 ID를 복제 할 때 여러 기준을 고려하여 모든 ID에 대해 하나의 최상 항목을 남겨 둡니다. – Jeff

답변

1

아이디어는 최상의 일치를 단독으로 결정할 복합 컬럼을 추가하는 것입니다. 예를 들어 첫 번째 기준이 max(year)이고 두 번째 기준이 max(val) 인 경우이를 tuple으로 결합하여 해당 열의 가장 큰 값을 취할 수 있습니다. 어떤 기준이 min(X)이면 -X을 튜플에 추가 할 수 있습니다. (tuples are compared element by element)

import pandas as pd 
data = {'id':[1, 1, 2, 3, 3, 3], 'year':[2001, 2002, 2002, 2001, 2002, 2002], 'val':[7, 8, 9, 17, 11, 12]} 
df = pd.DataFrame(data).set_index('id') 
df['year_val'] = df.apply(lambda row: (row.year, row.val), axis=1) 
df.reset_index().groupby('id').apply(
    lambda df: df[df['year_val'] == df['year_val'].max()]).drop(
    ['year_val'], axis=1).set_index('id') 

    val year 
id   
1  8 2002 
2  9 2002 
3 12 2002   
+0

오, 튜플 트릭은 이것에 완벽합니다. 고마워, 나는 파이썬의 일반적인 기능을 몰랐다. – Jeff

+0

@ JeffL. 다행 이구나! –