2016-10-19 95 views
1

我是一個機器學習的初學者和wan't使用ML蟒蛇,它是大熊貓模塊,以瞭解將非數字到數字的值。所以我有這樣的數據框:使用熊貓庫

COL1 COL2  COL3 
a  9/8/2016  2 
b  12/4/2016 23 
     ... 
n  1/1/2015  21 

COL1是一個字符串,Col2是一個時間戳,Col3是一個數字。現在我需要對這個Dataframe做一些分析,並且我想將所有的非數字數據轉換爲數字。我嘗試使用DictVectorizer()將COL1和2轉換爲數字,但首先我不確定這是做這種事情的最佳方式,其次我不知道如何處理時間戳。 當我使用DictVectorizer輸出會是這樣:

{u'COL3: {0:2, 1:23 , ...,n:21}, 'COL1': {0: u'a', 1:'b', ... , n:'n'}, 'COL2': {0: u'9/8/2016' , 1: u'12/4/2016' , ... , n:u'1/1/2016'}} 

但是從我所學到的,應該是這樣的,或者至少我知道我需要的東西是這樣的:

{COL1:'a', COL2: '9/8/2016' , COL3: 2 and so on} 

所以,問題: 1 - 什麼是將非數字(包括日期),以數值在sklearn圖書館使用的最佳途徑 2 - 什麼是使用DictVectorize正道()

任何幫助將是更加感激ated。

回答

1

爲了對非數值數據爲數字,你可以使用scikit學習的LabelEncoder。它會將每個類別編碼爲COL1的a,b,c爲整數。

假設DF是你的數據幀,嘗試:

from sklearn.preprocessing import LabelEncoder 
enc = LabelEncoder() 
enc.fit(df['COL1']) 
df['COL1'] = enc.transform(df['col1']) 
  • enc.fit()創建相應的整數值。
  • enc.transform()將編碼應用於df值。

第二列,使用熊貓to_datetime()功能應該做的伎倆,就像提到@奎因 - 韋伯,嘗試:

df['COL2'] = pd.to_datetime(df['COL2']) 
+0

謝謝你,它的工作原理爲COL1而不是COL2 – faranak777

+0

@Faranak對於'COL2'可以使用熊貓[pd.to_datetime](http://pandas.pydata.org/pandas- docs/stable/generated/pandas.to_datetime.html)函數: 'df ['COL2'] = pd。to_datetime(df ['COL2'])' – Tiphaine

1

你可以COL1轉換像這樣的東西:

import pandas as pd 
import string 
table = pd.DataFrame([ 
    ['a','9/8/2016',2], 
    ['b','12/4/2016',23], 
    ['n','1/1/2015',21], 
], columns=['COL1', 'COL2', 'COL3']) 
table['COL1'] = table['COL1'].map(dict(zip(list(string.lowercase), xrange(0,25)))) 

至於時間戳,你可以這樣做:

table['COL2'] = pd.to_datetime(
    table['COL2'], format='%m/%d/%Y' 
).dt.strftime(date_format='%Y%m%d') 
+0

映射是手動的? {'a':1,'b':2,'n':14} ...我的數據就像68k – faranak777

+0

68k行我的意思是 – faranak777

+0

我會更新我的答案中的代碼,以減少手動 –

0

字符串
考慮

s = pd.Series(list('abcdefagbfhickjjmshh')) 
# get unique values 
u = s.unique() 
# gen a mapping series 
m = pd.Series(range(len(u)), u) 
# encode 
s.map(m) 

0  0 
1  1 
2  2 
3  3 
4  4 
5  5 
6  0 
7  6 
8  1 
9  5 
10  7 
11  8 
12  2 
13  9 
14 10 
15 10 
16 11 
17 12 
18  7 
19  7 
dtype: int64 

的日期
有兩種方法可以做到這一點。如果您不關心日期的相對位置,請使用與字符串完全相同的方法。否則
考慮

d = pd.date_range('2015-03-31', periods=20).to_series().reset_index(drop=True) 

pd.Series(d.values.astype(np.timedelta64), d.index, np.int64) 

0  1427760000000000000 
1  1427846400000000000 
2  1427932800000000000 
3  1428019200000000000 
4  1428105600000000000 
5  1428192000000000000 
6  1428278400000000000 
7  1428364800000000000 
8  1428451200000000000 
9  1428537600000000000 
10 1428624000000000000 
11 1428710400000000000 
12 1428796800000000000 
13 1428883200000000000 
14 1428969600000000000 
15 1429056000000000000 
16 1429142400000000000 
17 1429228800000000000 
18 1429315200000000000 
19 1429401600000000000 
dtype: int64