2017-12-29 6 views
2

그룹화 된 인덱스 목록이 이미 dataframe 인 것으로 가정하고 groupby 또는 다른 기능을 사용하여 하위 데이터 프레임을 얻고 싶습니다. 나는 [df[df.index.isin(group)] for group in grouplist]과 같은 isin을 사용하여 데이터 프레임을 여러 번 쿼리 할 수 ​​있지만 매우 느린 것으로 보입니다. 어떻게 그룹을보다 효율적으로 만들 수 있습니까?그룹 인덱스로 팬더 그룹

grouplist = [[1],[29, 30, 31],[40],[46, 47, 48, 49],[58, 59],[68, 69, 70],[99, 100, 101],[103]] 

답변

2

당신이 loc 필요 보인다

[df.loc[group] for group in grouplist] 

편집 :

[df[np.in1d(df.A, group)] for group in grouplist] 

또는 :

[df[df.A.isin(group)] for group in grouplist] 
열에서 체크 값

빨리 사용하는 것입니다

타이밍 :

np.random.seed(123) 
N = 100000 

df = pd.DataFrame({'A': np.random.randint(150, size=N), 
        'B':np.random.rand(N)}) 
#print (df) 


grouplist = [[1],[29, 30, 31],[40],[46, 47, 48, 49], 
      [58, 59],[68, 69, 70],[99, 100, 101],[103]] 

def a(df): 
    df = df.set_index('A') 
    return [df.loc[group] for group in grouplist] 

def b(df): 
    return [df[df.A.isin(group)] for group in grouplist] 

def c(df): 
    return [df[np.in1d(df.A, group)] for group in grouplist] 


In [84]: %timeit (a(df)) 
10 loops, best of 3: 117 ms per loop 

In [85]: %timeit (b(df)) 
100 loops, best of 3: 18.3 ms per loop 

In [86]: %timeit (c(df)) 
100 loops, best of 3: 5.44 ms per loop 

주의 할 :

성능은 정말 데이터에 의존 - DataFrame의 크기와 값의 수를 그룹으로 grouplist에.

+0

감사합니다. 그러나 인덱스가 아니라 일부 값이있는 경우 어떻게해야합니까? – natsuapo

+0

그런 다음 가장 빠른 것은'df = df.set_index ('col')'로 색인을 설정 한 다음 'loc'을 사용합니다 – jezrael

+0

죄송 합니다만'df.set_index ('col')'및'loc' 'isin '을 사용하는 것보다 빠릅니다. 아마도 내 샘플 데이터가 작기 때문일 수 있습니까? – natsuapo