无法转置任务.获取未绑定本地错误



我正在尝试转置一个非常大的数据帧。由于文件的大小,我使用了Dask,并搜索了如何转置Dask数据框。

import pandas as pd
import numpy as np
import dask.dataframe as dd
genematrix = r"C:UsersfnafeeDesktoptobeMergedGENEMATRIX.csv"
genematrix_df = dd.read_csv(genematrix)
new_df = np.transpose(genematrix_df)
new_df.head()

返回如下

---------------------------------------------------------------------------
UnboundLocalError                         Traceback (most recent call last)
Input In [39], in <cell line: 6>()
4 genematrix = r"C:UsersfnafeeDesktoptobeMergedTSVSMERGED.csv"
5 genematrix_df = dd.read_csv(genematrix)
----> 6 new_df = np.transpose(genematrix_df)
7 new_df.head()
File <__array_function__ internals>:5, in transpose(*args, **kwargs)
File ~Anaconda3libsite-packagesnumpycorefromnumeric.py:660, in transpose(a, axes)
601 @array_function_dispatch(_transpose_dispatcher)
602 def transpose(a, axes=None):
603     """
604     Reverse or permute the axes of an array; returns the modified array.
605 
(...)
658 
659     """
--> 660     return _wrapfunc(a, 'transpose', axes)
File ~Anaconda3libsite-packagesnumpycorefromnumeric.py:54, in _wrapfunc(obj, method, *args, **kwds)
52 bound = getattr(obj, method, None)
53 if bound is None:
---> 54     return _wrapit(obj, method, *args, **kwds)
56 try:
57     return bound(*args, **kwds)
File ~Anaconda3libsite-packagesnumpycorefromnumeric.py:47, in _wrapit(obj, method, *args, **kwds)
45     if not isinstance(result, mu.ndarray):
46         result = asarray(result)
---> 47     result = wrap(result)
48 return result
File ~Anaconda3libsite-packagesdaskdataframecore.py:4213, in DataFrame.__array_wrap__(self, array, context)
4210     else:
4211         index = context[1][0].index
-> 4213 return pd.DataFrame(array, index=index, columns=self.columns)
UnboundLocalError: local variable 'index' referenced before assignment

问题似乎来自于一些我无法控制的内部函数。我是否需要改变文件的格式,或者我是否应该尝试一次在小块中而不是在一个大数据帧中进行此操作?

看起来您发现了任务中一个不相关的错误。这是一个已知的问题(gh# 6954),到目前为止,它似乎只出现在这样的情况下,你使用任务的方式,无论如何不工作:)

这个bug只是掩盖了真正的问题,那就是你不能转置一个dask.dataframe。这是因为任务的一个关键特性。数据框架允许行是未知的,但列必须是已知的。因此,转置数据帧需要计算整个帧。如果这真的是一个矩阵,似乎你应该使用dask。

如果需要标记维度,则使用带有任务后端的xarray。

例如,给定一个dask.dataframe:

import dask.dataframe as dd, pandas as pd, numpy as np
df = dd.from_pandas(pd.DataFrame({'A': np.arange(100, 200), 'B': np.random.random(size=100)}), npartitions=4)

可以转换为任务。数组使用dask.dataframe.to_dask_array,指定length =True来定义块大小:

In [13]: arr = df.to_dask_array(lengths=True)
In [14]: arr
Out[14]: dask.array<values, shape=(100, 2), dtype=float64, chunksize=(25, 2), chunktype=numpy.ndarray>

这个数组现在可以在不使用dask.Array.transpose或等效的.T属性计算图形的情况下进行转置:

In [15]: arr.T
Out[15]: dask.array<transpose, shape=(2, 100), dtype=float64, chunksize=(2, 25), chunktype=numpy.ndarray

如果需要使用坐标标签,则可以将其包装在xarray.DataArray中:

In [22]: import xarray as xr
...: da = xr.DataArray(
...:     df.to_dask_array(lengths=True),
...:     dims=['index', 'columns'],
...:     coords=[df.index.compute(), df.columns],
...: )
In [23]: da
Out[23]:
<xarray.DataArray 'values-8d50dbfa8ed951a8ffb2ae5d5cd554bb' (index: 100,
columns: 2)>
dask.array<values, shape=(100, 2), dtype=float64, chunksize=(25, 2), chunktype=numpy.ndarray>
Coordinates:
* index    (index) int64 0 1 2 3 4 5 6 7 8 9 ... 90 91 92 93 94 95 96 97 98 99
* columns  (columns) object 'A' 'B'
In [24]: da.T
Out[24]:
<xarray.DataArray 'values-8d50dbfa8ed951a8ffb2ae5d5cd554bb' (columns: 2,
index: 100)>
dask.array<transpose, shape=(2, 100), dtype=float64, chunksize=(2, 25), chunktype=numpy.ndarray>
Coordinates:
* index    (index) int64 0 1 2 3 4 5 6 7 8 9 ... 90 91 92 93 94 95 96 97 98 99
* columns  (columns) object 'A' 'B'

似乎是一个缩进问题,因为这个错误是说变量index没有在

行之前赋值
return pd.DataFrame(array, index=index, columns=self.columns)

最新更新