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)