如何将pandas str.split调用转换为dask

如何将pandas str.split调用转换为dask,dask,Dask,我有一个dask数据帧,其中索引是一个字符串,如下所示: 12/09/2016 00:00;32.0046;-106.259 12/09/2016 00:00;32.0201;-108.838 12/09/2016 00:00;32.0224;-106.004 (它基本上是一个编码日期时间、纬度、行的经度的字符串) 我想在dask上下文中将其拆分为表示每个字段的各个列 我可以使用熊猫数据帧来实现这一点,如下所示: df['date'], df['Lat'], df['Lon'] = df.in

我有一个dask数据帧,其中索引是一个字符串,如下所示:

12/09/2016 00:00;32.0046;-106.259
12/09/2016 00:00;32.0201;-108.838
12/09/2016 00:00;32.0224;-106.004
(它基本上是一个编码日期时间、纬度、行的经度的字符串)

我想在dask上下文中将其拆分为表示每个字段的各个列

我可以使用熊猫数据帧来实现这一点,如下所示:

df['date'], df['Lat'], df['Lon'] = df.index.str.split(';', 2).str
但在我尝试过的几次尝试中,这在达斯克都不起作用。如果我直接用df替换dask df,我会得到错误:

'Index' object has no attribute 'str'
TypeError: 'StringAccessor' object is not iterable
如果使用列名而不是索引作为:

forecastDf['date'], forecastDf['Lat'], forecastDf['Lon'] = forecastDf['dateLocation'].str.split(';', 2).str
我得到一个错误:

'Index' object has no attribute 'str'
TypeError: 'StringAccessor' object is not iterable
这是一个在熊猫身上运行的例子

import pandas as pd
df = pd.DataFrame()
df['dateLocation'] = ['12/09/2016 00:00;32.0046;-106.259','12/09/2016   00:00;32.0201;-108.838','12/09/2016 00:00;32.0224;-106.004']
df = df.set_index('dateLocation')
df['date'], df['Lat'], df['Lon'] = df.index.str.split(';', 2).str
df.head()
如果我直接将其转换为dask,我会得到一个错误

import dask.dataframe as dd
dd = dd.from_pandas(df, npartitions=1)
dd['date'], dd['Lat'], dd['Lon'] = dd.index.str.split(';', 2).str
>>TypeError: 'StringAccessor' object is not iterable

首先确保该列是stringdtype

forecastDD['dateLocation'] = forecastDD['dateLocation'].astype('str')
然后你可以用它在dask中分割

splitColumns = client.persist(forecastDD['dateLocation'].str.split(';',2))
然后,您可以索引新dataframe splitColumns中的列,并将它们添加回原始数据帧

forecastDD = forecastDD.assign(Lat=splitColumns.apply(lambda x: x[0], meta=('Lat', 'f8')), Lon=splitColumns.apply(lambda x: x[1], meta=('Lat', 'f8')), date=splitColumns.apply(lambda x: x[2], meta=('Lat', np.dtype(str))))
不幸的是,如果不调用compute并创建temp数据帧,我就不知道如何做

forecastDf['date'] = forecastDf['dateLocation'].str.partition(';')[0]
forecastDf['Lat'] = forecastDf['dateLocation'].str.partition(';')[2]
forecastDf['Lon'] = forecastDf['dateLocation'].str.partition(';')[4]

让我知道这是否适合你

我正试图在熊猫身上重现你的例子,但很难做到。你能提供一个在熊猫中工作的可复制的小例子吗?我已经用一个在熊猫中可复制的工作例子更新了这篇文章。谢谢你解决过这个问题吗?我正在尝试做
ddf['col'].str[:-1]
,但没有成功…我确实找到了答案,并提交了我的答案。Dask数组不支持yourarray['newcol']=某些_系列类型的赋值。这可能可以更简单地实现。我们可以探索在这个方法上进行扩展-单个赋值案例:dd=dd.assign(**{'date':dd.index.str.split(';',n=1.str[0]})dd.compute()