2014-12-05 2 views
0

grouper pandas에 새 색인을 추가하십시오.groupby 객체를 메모리에서 동적으로 변경하지 않고 메모리를 재구성하지 않고

id에 의해 색인 된 df 데이터 프레임이 있다고 가정 해보십시오.

id에 의해 색인화 된 하나의 열, df1,df2,..dfn이있는 다른 데이터 프레임 집합이 있다고 가정합니다.

keys=[df1,..,dfn]grouper=df.groupby(keys) 명령을 실행하는 데 몇 초가 걸릴 수 있습니다 (데이터 프레임이 매우 크기 때문에).

내 데이터 프레임 df에 새 행을 추가하고 싶습니다.이 프로세스의 일부가이 행이 있어야 할 그룹 (예 : grouper.groups.keys() 중 하나)을 식별해야합니다. 마지막으로 이 행을 데이터 프레임에 추가하려고합니다.

제 질문은 : pandas.GroupBy가 그런 기능을 제공합니까? 새 행 추가를 관리 할 다른 메커니즘을 만들어야합니까? grouper.groups dict와 병행하여 내 자신의 사전을 구성하는 것과는 별도로 어떻게 구축할지에 대해 조언 할 수 있습니까?

이론적으로 새로운 행이 데이터 프레임에 추가 될 때마다 모든 것을 다시 그룹화 할 수 있지만 데이터 프레임이 2MM +의 순서 인 것으로 간주 할 때마다 새로운 행마다이를 수행하지 않는 것이 좋습니다.

+0

이하실 수 없습니다 만듭니다. 한 줄로 재편성해야합니까? 그룹을 알아 내서 특정한 계산을 되풀이하지 않으시겠습니까? – Jeff

답변

0

많은 그룹이 없으면 그룹화를위한 몇 초가 매우 이상합니다.

In [18]: df.info() 
<class 'pandas.core.frame.DataFrame'> 
Int64Index: 2000000 entries, 0 to 1999999 
Data columns (total 4 columns): 
data1 float64 
data2 float64 
key1  object 
key2  object 
dtypes: float64(2), object(2) 
memory usage: 76.3+ MB 

In [19]: %timeit df.groupby(['key1','key2']) 
10000 loops, best of 3: 51.3 us per loop 

In [20]: %timeit df.groupby(['key1','key2']).sum() 
1 loops, best of 3: 1.5 s per loop 

N = 2000000 
ngroups = 20000 

def get_test_data(ngroups=100, n=N): 
    unique_groups = range(ngroups) 
    arr = np.asarray(np.tile(unique_groups, n/ngroups), dtype=object) 

    if len(arr) < n: 
     arr = np.asarray(list(arr) + unique_groups[:n - len(arr)], 
         dtype=object) 

    random.shuffle(arr) 
    return arr 

# aggregate multiple columns 
df = DataFrame({'key1' : get_test_data(ngroups=ngroups), 
       'key2' : get_test_data(ngroups=ngroups), 
       'data1' : np.random.randn(N), 
       'data2' : np.random.randn(N)}) 
+0

감사합니다. 제프, 앞으로 며칠 동안이 내용을 자세히 읽도록하겠습니다. 현재로서는 70,000 개 이상의 그룹과 2MM 목록을 보유하고 있습니다. – user3659451

관련 문제