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

时间:2017-08-01 03:04:19

标签: 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上下文中将其拆分为代表每个字段的各个列。

我可以用pandas数据框这样做:

df['date'], df['Lat'], df['Lon'] = df.index.str.split(';', 2).str

但是,对于我曾经尝试过的几次尝试,这并没有在dask中发挥作用。如果我直接用df替换dask df我得到错误:

'Index' object has no attribute 'str'

如果我使用列名而不是索引:

forecastDf['date'], forecastDf['Lat'], forecastDf['Lon'] = forecastDf['dateLocation'].str.split(';', 2).str

我收到错误:

TypeError: 'StringAccessor' object is not iterable

这是在Pandas中运行的可运行示例

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

2 个答案:

答案 0 :(得分:1)

首先确保列是字符串dtype

forecastDD['dateLocation'] = forecastDD['dateLocation'].astype('str')

然后你可以用这个来拆分dask

splitColumns = client.persist(forecastDD['dateLocation'].str.split(';',2))

然后,您可以索引新数据框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))))

不幸的是,我无法在不调用计算和创建临时数据帧的情况下弄清楚如何做到这一点。

答案 1 :(得分:1)

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

让我知道这是否适合您!