преобразование нечислового значения в числовое с использованием библиотек Panda

#python #pandas

#python #pandas

Вопрос:

Я изучаю Pandas и пришел к интересному вопросу. Итак, у меня есть фрейм данных, подобный этому:

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

COL1 — это строка, Col2 — это временная метка, а Col3 — это число. Теперь мне нужно провести некоторый анализ этого фрейма данных, и я хочу преобразовать все нечисловые данные в числовые. Я пытался использовать 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()

Любая помощь будет оценена.

Ответ №1:

Для кодирования нечисловых данных в числовые вы можете использовать LabelEncoder от scikit-learn. Он будет кодировать каждую категорию, такую как 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.

Для второго столбца использование функции Pandas to_datetime() должно сработать, как упоминал @quinn-weber, попробуйте:

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

Комментарии:

1. @Faranak Для COL2 вы можете использовать функцию Pandas pd.to_datetime : df['COL2'] = pd.to_datetime(df['COL2'])

Ответ №2:

Вы могли бы преобразовать 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')
  

Комментарии:

1. отображение выполняется вручную? {‘a’: 1, ‘b’: 2, ‘n’: 14} … мои данные похожи на 68k

2. я имею в виду 68 тыс. строк

Ответ №3:

для строк
рассмотрим

 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