我使用大型数据集,使pandas group和groupby函数花费很长时间/使用太多内存。我听说有人说groupby可能很慢,但我找不到更好的解决方案。
如果我的数据框有2列类似于:
df = pd.DataFrame({'a':[1,2,2,4], 'b':[1,1,1,1]})
a b
1 1
2 1
2 1
4 1
我希望返回与另一列中的值匹配的值列表:
a b list_of_b
1 1 [1]
2 1 [1,1]
2 1 [1,1]
4 1 [1]
我目前使用:
df_group = df.groupby('a')
df['list_of_b'] = df.apply(lambda row: df_group.get_group(row['a'])['b'].tolist(), axis=1)
上面的代码适用于小型内容,但不适用于大型数据帧(df> 1,000,000行)是否有人有更快的方法来执行此操作?
答案 0 :(得分:0)
在4K行上我得到以下内容:
In [29]:
df_group = df.groupby('a')
%timeit df.apply(lambda row: df_group.get_group(row['a'])['b'].tolist(), axis=1)
%timeit df['a'].map(df.groupby('a')['b'].apply(list))
1 loops, best of 3: 4.37 s per loop
100 loops, best of 3: 4.21 ms per loop
答案 1 :(得分:0)
只是进行分组然后再加入原始数据框似乎要快得多:
def make_lists(df):
g = df.groupby('a')
def list_of_b(x):
return x.b.tolist()
return df.set_index('a').join(
pd.DataFrame(g.apply(list_of_b),
columns=['list_of_b']),
rsuffix='_').reset_index()
这为我提供 192ms 每个循环,其中 1M 行生成如下:
df1 = pd.DataFrame({'a':[1,2,2,4], 'b':[1,1,1,1]})
low = 1
high = 10
size = 1000000
df2 = pd.DataFrame({'a':np.random.randint(low,high,size),
'b':np.random.randint(low,high,size)})
make_lists(df1)
Out[155]:
a b list_of_b
0 1 1 [1]
1 2 1 [1, 1]
2 2 1 [1, 1]
3 4 1 [1]
In [156]:
%%timeit
make_lists(df2)
10 loops, best of 3: 192 ms per loop
答案 2 :(得分:0)
我能想到的最短的解决方案:
Navigate