Python 更快的`pandas.DataFrame.groupby()`当您有*很多*组时
我希望通过索引从数据帧分组的列创建列表。要执行此任务,请执行以下操作:Python 更快的`pandas.DataFrame.groupby()`当您有*很多*组时,python,pandas,dataframe,Python,Pandas,Dataframe,我希望通过索引从数据帧分组的列创建列表。要执行此任务,请执行以下操作: 按索引分组 将每组中的所有项目聚合到一个列表中 但是,一旦组的数量变大,此操作就会变得非常缓慢。这里是一个说明性的例子 首先,数据: 随机导入 导入uuid 将numpy作为np导入 作为pd进口熊猫 np.随机种子(42) 随机种子(42) def make_df(nr_level_one:int=1000,max_nr_Path:int=10): 一级\u值=np.arange(nr\u一级) count\u path=
随机导入
导入uuid
将numpy作为np导入
作为pd进口熊猫
np.随机种子(42)
随机种子(42)
def make_df(nr_level_one:int=1000,max_nr_Path:int=10):
一级\u值=np.arange(nr\u一级)
count\u path=np.random.randint(1,max\u nr\u path+1,size=nr\u level\u one)
idx\u one=np.重复(级别\u one\u值,计数路径)
nr_obs=np.sum(计数路径)
idx_two=np.arange(nr_obs)
idx=pd.MultiIndex.from_元组(
zip(idx_-one,idx_-two),name=['one','two']
)
路径=[str(uuid.uuid(int=random.getrandbits(128)).replace('-','/'))
对于范围内的(nr_obs)]
返回pd.DataFrame(路径,索引=idx,列=['path'])
df=make_df()
df
我想将索引中第一级的所有path
s聚合到一个列表中这是实现我想要的功能:
df.groupby(level='one').agg(列表)
但是,随着组数的增加,这会变得非常缓慢(尽管它似乎与组数成线性关系)
%%timeit
make_df(100000).groupby(level='one').agg(列表)
有没有更快的方法来完成与熊猫相同的任务?为什么分组后要重命名?没有必要-我将删除。现在的输出是一个列表。可能不是
pandas
无法很好地处理复杂对象的存储,您可能会看到这样的结果(groupby在组上变成了一个缓慢的循环,而不是在cython中具有快速路径或可以在整个数据帧上进行矢量化的循环)。你为什么需要这些清单?任何后续操作都将非常困难。您已经有了多索引,我希望在这样的组织下,大多数其他操作都可以有效地完成。(Ofc如果你需要某个特定输出的列表,我想你被卡住了)为什么在分组后要重命名?没有必要-我会删除。现在的输出是一个列表。可能不是pandas
无法很好地处理复杂对象的存储,您可能会看到这样的结果(groupby在组上变成了一个缓慢的循环,而不是在cython中具有快速路径或可以在整个数据帧上进行矢量化的循环)。你为什么需要这些清单?任何后续操作都将非常困难。您已经有了多索引,我希望在这样的组织下,大多数其他操作都可以有效地完成。(Ofc如果您需要某些特定输出的列表,我认为您被卡住了)
path
one two
0 0 bdd640fb/0667/1ad1/1c80/317fa3b1799d
1 23b8c1e9/3924/56de/3eb1/3b9046685257
2 bd9c66b3/ad3c/2d6d/1a3d/1fa7bc8960a9
3 972a8469/1641/9f82/8b9d/2434e465e150
4 17fc695a/07a0/ca6e/0822/e8f36c031199
... ... ...
999 5443 fe66c4fa/35ed/ff38/9197/107c89b702ed
5444 a560c775/58cf/d966/6f11/0436b3c28ec5
5445 49e785c7/cbd8/715e/ae98/b722cf97b016
5446 f7eefd84/b31c/8349/5799/2f42351b3e63
5447 be3de265/d471/8d86/8d36/645980f6c26c
5448 rows × 1 columns
path
one
0 [bdd640fb/0667/1ad1/1c80/317fa3b1799d, 23b8c1e...
1 [6b65a6a4/8b81/48f6/b38a/088ca65ed389, 4737819...
2 [371ecd7b/27cd/8130/4722/9389571aa876, 1a2a73e...
3 [3139d32c/93cd/59bf/5c94/1cf0dc98d2c1, a9488d9...
4 [29a3b2e9/5d65/a441/d588/42dea2bc372f, ab9099a...
... ...
995 [5dc2fd9b/f1bd/b57b/b8dd/dfc2963ba31c, aa1c5dc...
996 [1e228ade/59c6/7a52/8f80/d1ef4615575c, d60b04a...
997 [f151ff15/a46e/e99e/ae4e/d89fd659d69f, bf5628b...
998 [17a85108/43b9/3b02/7089/8400b2932bfb, 5d15c12...
999 [85e620fe/a44e/b3e1/c5ba/136f594ed61a, afe1d84...
1000 rows × 1 columns
15 s ± 230 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)