使用Panda库将非数字值转换为数值

时间:2016-10-19 22:42:48

标签: python pandas

我正在学习熊猫,我遇到了一个有趣的问题。所以我有一个像这样的Dataframe:

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

的正确方法是什么

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:3)

要将非数字数据编码为数字,您可以使用scikit-learn的LabelEncoder。它会将每个类别(例如COL1的abc编码为整数。

假设df是您的数据帧,请尝试:

from sklearn.preprocessing import LabelEncoder
enc = LabelEncoder()
enc.fit(df['COL1'])
df['COL1'] = enc.transform(df['col1'])
  • enc.fit()创建相应的整数值。
  • enc.transform()将编码应用于df值。

对于第二列,使用Pandas to_datetime()函数应该可以解决问题,就像@ quinn-weber提到的那样,尝试:

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

答案 1 :(得分:1)

您可以使用以下内容转换COL1:

<Host name="localhost" appBase="webapps">
    ...
    <Context docBase="/your/path/with/pdfs" path="/pdfs/" />
</Host>

至于时间戳,你可以这样做:

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

答案 2 :(得分: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