2016-10-19 96 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