首页 > 解决方案 > 将 pandas 列转换为列表列表(基于多索引)

问题描述

假设我在一个大的 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()

标签: pythonpandasdask

解决方案


我们可以用:

[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)

推荐阅读