【问题标题】:Converting a pandas column into a list of list (based on multindex)将 pandas 列转换为列表列表(基于多索引)
【发布时间】:2020-03-24 04:51:34
【问题描述】:

假设我在一个大的 hdf5 文件中有这个数据帧

      A     B    C
0   103896  1   2.0
1   103896  1   0.0
2   103896  1   5.0
3   103896  2   0.0
4   103896  2   7.0
5   103896  2   0
6   103896  2   0.0
7   103897  1   7.0
8   103897  1   0

根据前两列,我想创建一个像这样的最终列表:

[[2.0, 0.0, 5.0], [0.0, 7.0, 0, 0.0], [7.0, 0]]

为了做到这一点,我想到的唯一方法是:

 df = df.groupby(['A', 'B'])['C'].apply(list)

然后迭代 df 或只是转换:

final_list = df['C']

考虑到我的数据集很大,是否有其他方法在 groupby 之后不返回新数据帧?

使用 dask 执行此操作对计算机内存来说非常昂贵,因为不是真正的减少:

df = df.groupby(['A', 'B'])['C'].apply(list, meta=(float)).compute()

【问题讨论】:

    标签: python pandas dask


    【解决方案1】:

    我们可以使用:

    [list(c) for i,c in  df.groupby(['A','B'])['C']]
    #[[2.0, 0.0, 5.0], [0.0, 7.0, 0.0, 0.0], [7.0, 0.0]]
    

    df.groupby(['A', 'B'])['C'].apply(list).tolist()
    #[[2.0, 0.0, 5.0], [0.0, 7.0, 0.0, 0.0], [7.0, 0.0]]
    

    时间对比:


    %%timeit
    [list(c) for i,c in  df.groupby(['A','B'])['C']]
    1.82 ms ± 93.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
    
    %%timeit
    df.groupby(['A', 'B'])['C'].apply(list).tolist()
    3.38 ms ± 473 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    

    【讨论】:

    • 你知道如何使用 dask 执行此操作 [list(c) for i,c in df.groupby(['A','B'])['C']]避免将整个数据集加载到内存中?
    猜你喜欢
    • 2017-12-19
    • 2021-11-30
    • 1970-01-01
    • 2021-12-17
    • 2016-09-26
    • 2023-04-03
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多