2017-08-01 42 views
1

我有一个DASK数据帧,其中该索引是一个字符串,它看起来像这样:如何转换大熊猫str.split打电话到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 

但是,这并不在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 

这是一个可在熊猫工作的可运行示例

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 
+0

我试图在熊猫中重现你的例子,并且很难。你能提供一个在Pandas中工作的可复制的小例子吗? – MRocklin

+0

我已经在熊猫中更新了一个可以编辑的工作示例。谢谢! –

+0

你曾经解决过这个问题吗?我试图做'ddf ['col']。str [: - 1]'没有成功... – citynorman

回答

0

首先确保该列串D型

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

不幸的是,我不知道如何做到这一点,而无需调用计算和创建临时数据帧。