Dask DataFrame调用np.transpose转置触发UnboundLocalError报错
报错核心原因
np.transpose() 对Dask DataFrame无效是必然的——Dask原生就没有实现全局DataFrame转置的功能。
Dask的核心逻辑是把超大数据按行切分成多个可以放进内存的小分块做并行计算,而转置需要把全表的行和列完全互换,所有数据都要跨分块重排,完全打破了Dask按行分片的设计前提,硬走numpy转置接口就会触发框架内部的未定义变量bug,这个不是你改两行调用代码能解决的。
可行解决方案
根据你转置后的数据能不能放进内存选方案就行,不用硬套Dask:
- 如果转置后的结果总大小小于你机器的可用内存:直接用pandas分块读就行,没必要用Dask,示例代码如下:
import pandas as pd genematrix_path = r"C:\Users\fnafee\Desktop\tobeMerged\GENEMATRIX.csv" # chunksize按你内存大小调整,比如内存大就设成50000,小就设成5000 chunks = [] for chunk in pd.read_csv(genematrix_path, chunksize=10000, index_col=0): # 如果你的源文件第一列不是行名/索引列,就删掉上面的index_col=0参数 chunks.append(chunk) # 拼接全量数据后直接转置 raw_df = pd.concat(chunks, axis=0) res_df = raw_df.T # 导出结果 res_df.to_csv(r"C:\Users\fnafee\Desktop\tobeMerged\GENEMATRIX_transposed.csv")
- 如果转置后的结果还是大到没法整体放进内存:就按列拆分逐块转置,全程内存只需要存少量列的数据,多大的文件都能跑:
- 先单独读取源文件第一列(原表行名,转置后就是结果表的表头)
- 每次固定读取源文件的N列(N根据内存调整,比如一次读50-200列)
- 对当前读到的这部分数据做转置,追加写入结果文件,第一次写入时带表头,后续追加写入跳过表头即可
- 避坑提醒:不用搜各种Dask转置的歪路子,所有号称能用Dask做全量转置的方法本质都是把全量数据偷偷拉到本地内存,内存不够直接OOM,和直接用pandas没有区别,稳定性还不如上面两种方法。
内容的提问来源于stack exchange,提问作者Farzeen Nafees
相关产品推荐
相关产品推荐

