Python 索引器错误:将dask数组分配给dask数据帧列时元组索引超出范围
我试图将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.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