#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