假设我在大型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之后返回新数据帧吗?
这样做会使计算机内存消耗很大,因为这并不是真正的减少:
df = df.groupby(['A', 'B'])['C'].apply(list, meta=(float)).compute()
答案 0 :(得分: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]]
时间比较:
when I should use apply
%%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)