2017-08-01 60 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)))) 

不幸的是,我不知道如何做到這一點,而無需調用計算和創建臨時數據幀。