动态更改内存中的groupby对象而不重建它

时间:2014-12-05 01:12:16

标签: python python-2.7 pandas

为石斑鱼大熊猫添加新索引。

假设我有df索引的数据框id

假设我有一组其他数据框,其中有一列df1,df2,..dfn,由id编制索引。

鉴于命令keys=[df1,..,dfn]grouper=df.groupby(keys)需要几秒钟才能运行(因为我的数据帧非常大)。

我想在我的数据框df中添加新行,此过程的一部分将需要识别此行应该在的组(即:grouper.groups.keys()之一),最后,我想将此行添加到数据框中。

我的问题是:pandas.GroupBy是否提供此类功能?我是否需要创建另一种机制来管理新的行添加?除了构建我自己的dict与grouper.groups dict并行运行之外,你能否建议如何构建它。

理论上,每次将新行添加到数据帧时,我都可以重新组合所有内容,但考虑到数据帧的大小为2MM +,我更倾向于不是每个新行都这样做。

1 个答案:

答案 0 :(得分: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)})