python - 将 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()
解决方案
我们可以用:
[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)
推荐阅读
- sql-server - SQL Server - 薛定谔的观点
- amazon-web-services - AWS DMS 端点与 Redshift 的连接不起作用
- python - 无法掌握如何在这段代码中将 True 分配给变量
- node.js - NodeJS:将表单数据转发到外部 API
- algorithm - 根据开始日期和每周天数数据计算结束日期
- excel - 从搜索的单元格值开始复制动态范围数组
- php - 如何解决 laravel 中的独特字段错误?
- c++ - AddressSanitizer 可以用来记录 malloc 调用吗?
- api - 使用 POST 方法共享目标 API 在“获取”中进行 GET 调用
- node.js - 在 Google Cloud Shell 编辑器中输出/测试代码