为石斑鱼大熊猫添加新索引。
假设我有df
索引的数据框id
。
假设我有一组其他数据框,其中有一列df1,df2,..dfn
,由id
编制索引。
鉴于命令keys=[df1,..,dfn]
和grouper=df.groupby(keys)
需要几秒钟才能运行(因为我的数据帧非常大)。
我想在我的数据框df
中添加新行,此过程的一部分将需要识别此行应该在的组(即:grouper.groups.keys()之一),最后,我想将此行添加到数据框中。
我的问题是:pandas.GroupBy是否提供此类功能?我是否需要创建另一种机制来管理新的行添加?除了构建我自己的dict与grouper.groups
dict并行运行之外,你能否建议如何构建它。
理论上,每次将新行添加到数据帧时,我都可以重新组合所有内容,但考虑到数据帧的大小为2MM +,我更倾向于不是每个新行都这样做。
答案 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)})