2016-01-10 61 views
0

以下操作地圖大熊貓數據幀列的矩陣

import pandas as pd 
import numpy as np 
data = pd.read_csv(fname,sep=",",quotechar='"') 

將創建一個650000×9數據幀。第一列包含日期,以下內容旨在將單個日期戳轉換爲5個獨立的功能。

def timepartition(elm): 
    tm = time.strptime(elm,"%Y-%m-%d %H:%M:%S") 
    return tm[0], tm[1], tm[2], tm[3], tm[4] 

data["Dates"].map(timepartition) 

我想將這5個值賦給一個650,000x7的np矩陣。

xtrn = np.zeros(shape=(data.shape[0],7)) 
xtrn[:,0:4] = np.asarray(data["Dates"].map(timepartition)) 
#above returns error ValueError: could not broadcast input array from shape (650000) into shape (650000,4) 
+0

你沒有顯示這是行不通的。跟蹤回溯的任何錯誤? – Evert

+0

'xtrn [:,0:4]',對我來說,它的形狀是'(data.shape [0],4)'。不是'(data.shape [0],5)'。 – Evert

+0

@Evert檢查編輯。 – TheM00s3

回答

1

您可能會嘗試使用某些內置的pandas功能。

dates = pd.to_datetime(data['Dates']) 
date_df = pd.DataFrame(dict(
    year=dates.dt.year, 
    month=dates.dt.month, 
    day=dates.dt.day, 
    # etc. 
)) 
xtrn[:, :5] = date_df.values # use date[['year', 'month', 'day', etc.]] if the order comes out wrong 
0

應用於數據幀的映射函數映射到一個新的序列對象,通過返回元組,它將作爲一個對象序列返回。

另一種方法如下。

進行以下更改timepartition:

def timepartition(elm): 
    tm = time.strptime(elm,"%Y-%m-%d %H:%M:%S") 
    return [tm[i] for i in range(5)] 

它將會返回一個上市一個元組。以下代碼將從具有所需尺寸的數據幀系列創建矩陣,並將其映射到xtrn

xtrn[:,0:5] = = np.matrix(map(timepartition, data["Dates"].tolist())) 

NP矩陣將推斷從嵌套列表的矩陣從應用從數據分區功能的系列,這是平在這種情況下的列表表示。

0

以下爲我工作。我不確定哪種方法更快,但我更容易理解發生了什麼。在這裏,我的數據集「犯罪」是你的「數據」,我們的時間格式有點不同。

def timepartition(elm): 
    tm = time.strptime(elm,"%m/%d/%Y %H:%M:%S %p") 
    return tm[0:5] 

zeros = np.zeros(shape=(crimes.shape[0],3), dtype=np.int) 
dates = np.array([timepartition(crimes["Date"][i]) for i in range(0,len(crimes))]) 
new = np.hstack((dates,zeros))