Python 索引器错误:将dask数组分配给dask数据帧列时元组索引超出范围

Python 索引器错误:将dask数组分配给dask数据帧列时元组索引超出范围,python,dataframe,dask,Python,Dataframe,Dask,我试图将dask数组分配给dask数据帧,但遇到了这个奇怪的问题 例如: 导入dask 将dask.dataframe作为dd导入 将dask.array导入为da #像官方文档一样创建随机数据框 ts_df=dask.dataset.timeseries( ‘2000’、‘2003’、频率为2H、分区频率为2Y’ ) 打印(ts_df.head()) """ id名称x y z 时间戳 时间:0.562319-0.331690-0.894009 法兰克-0.952083-0.725073-1.

我试图将dask数组分配给dask数据帧,但遇到了这个奇怪的问题

例如:

导入dask
将dask.dataframe作为dd导入
将dask.array导入为da
#像官方文档一样创建随机数据框
ts_df=dask.dataset.timeseries(
‘2000’、‘2003’、频率为2H、分区频率为2Y’
)
打印(ts_df.head())
"""
id名称x y z
时间戳
时间:0.562319-0.331690-0.894009
法兰克-0.952083-0.725073-1.677156
2000-12-3104:00:00932鲍勃0.579130 0.923146 1.502276
乌苏拉0.120449-0.059130 0.061319
2000-12-31 08:00:00 975维克托-0.947120 0.647456-0.299664
"""
#使用dask系列指定新列效果良好
ts_df['z']=ts_df.x+ts_df.y
#da.where()返回dask.array.core.array
new_col=da.where(
((ts_df.x>=0)|(ts_df.y>=0)),
“不适用”,
ts_df.x.astype(str)+'x'+ts_df.y.astype(str)
)
#使用dask数组分配新列时出错
ts_df['test']=新的
---------------------------------------------------------------------------
索引器回溯(最后一次最近调用)
在里面
2((ts_df.x>=0)|(ts_df.y>=0)),
3‘不适用’,
---->4 ts_df.x.astype(str)+'x'+ts_df.y.astype(str)
5 )
~/venvs/se/lib/python3.7/site-packages/dask/dataframe/core.py in\uuuuuu setitem\uuuuuuuu(self,key,value)
3373 df=self.assign(**{k:key}中k的值)
3374其他:
->3375 df=self.assign(**{key:value})
3376
3377 self.dask=df.dask
分配中的~/venvs/se/lib/python3.7/site-packages/dask/dataframe/core.py(self,**kwargs)
3633                         )
3634                     )
->3635 kwargs[k]=来自_dask_数组(v,index=self.index)
3636
3637对=列表(总和(kwargs.items(),())
~/venvs/se/lib/python3.7/site-packages/dask/dataframe/io/io.py从_-dask_数组输入(x,列,索引)
416数据帧。帧到记录:反向转换
417     """
-->418 meta=\u meta\u来自\u数组(x,列,索引)
419
420如果x.ndim==2且len(x.chunks[1])>1:
~/venvs/se/lib/python3.7/site-packages/dask/dataframe/io/io.py在\u meta\u中从\u数组(x,列,索引)
57         )
58.其他:
--->59如果np.isnan(x.shape[1]):
60提升值错误(“必须知道沿轴1的形状”)
61如果列为无:
索引器错误:元组索引超出范围
如何将新列正确分配给dask数据帧? 如果我执行
ts_df['test']=tt.compute()
它返回
TypeError:Column赋值不支持numpy.ndarray类型,这很有意义,因为它是一个分布式数据帧。我们仍然应该为数据帧分配一个分布式数组。我尝试了
ts_df.assign(test=new\u col)
也得到了相同的索引器

环境:
--Python 3.7.6

--dask 2.9.2

经过反复试验,我找到了一个解决办法:

x_y=ts_df.x.astype(str)+'x'+ts_df.y.astype(str)
ts_df['test']=x_y.掩码((ts_df.x>=0)|(ts_df.y>=0),'N/A')
同样基于讨论,似乎由
da返回的dask数组存在问题。其中
dask.array
。给定dask系列输入,shape和chunksize为空。
如果输入是dask数组,则可以工作

new\u col=da.where(
((ts_df.x>=0)|(ts_df.y>=0))。值,
“不适用”,
ts_df.x.astype(str)+'x'+ts_df.y.astype(str)
)
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-224-392b07690d97> in <module>
      2     ((ts_df.x >= 0) | (ts_df.y >= 0)),
      3     'N/A',
----> 4     ts_df.x.astype(str) + 'x' + ts_df.y.astype(str)
      5 )

~/venvs/se/lib/python3.7/site-packages/dask/dataframe/core.py in __setitem__(self, key, value)
   3373             df = self.assign(**{k: value for k in key})
   3374         else:
-> 3375             df = self.assign(**{key: value})
   3376 
   3377         self.dask = df.dask

~/venvs/se/lib/python3.7/site-packages/dask/dataframe/core.py in assign(self, **kwargs)
   3633                         )
   3634                     )
-> 3635                 kwargs[k] = from_dask_array(v, index=self.index)
   3636 
   3637         pairs = list(sum(kwargs.items(), ()))

~/venvs/se/lib/python3.7/site-packages/dask/dataframe/io/io.py in from_dask_array(x, columns, index)
    416     dask.dataframe._Frame.to_records: Reverse conversion
    417     """
--> 418     meta = _meta_from_array(x, columns, index)
    419 
    420     if x.ndim == 2 and len(x.chunks[1]) > 1:

~/venvs/se/lib/python3.7/site-packages/dask/dataframe/io/io.py in _meta_from_array(x, columns, index)
     57         )
     58     else:
---> 59         if np.isnan(x.shape[1]):
     60             raise ValueError("Shape along axis 1 must be known")
     61         if columns is None:

IndexError: tuple index out of range