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

how to convert pandas str.split call to to 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

但是对于我尝试过的几次尝试来说,这并不奏效。如果我直接用 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

首先确保列是string dtype

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

然后你就可以用它来快速拆分

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))))

不幸的是,如果不调用计算和创建临时数据帧,我不知道该怎么做。

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

让我知道这是否适合您!