Как я могу взять один из моих хирархических индексов панд и один горячий кодировать его? - PullRequest
0 голосов
/ 25 сентября 2018

Я создал многоиерархический индекс из кадров, которые были проиндексированы по времени:

original_thing
 time                day_1  day_2  day_3 day_4
 2018-05-24 20:00:00  0     0      1     0
 2018-05-25 00:00:00  0     0      0     1
 2018-05-25 04:00:00  0     0      0     1
 2018-05-25 08:00:00  0     0      0     1

пересчитал и агрегировал информацию в виде различных объектов и упаковал их в список

 DF_list = [original_thing, resampled_1, resampled_2]

используя pandas concat с кодом, который выглядит в основном так:

thisthing = pandas.concat(DF_list, keys=range(len(DF_list), names=['one','time'], sort=True)

, чтобы получить Dataframe, который выглядит следующим образом:

one  time                   day_1    day_2    day_3    day_4
 2    2018-05-24 00:00:00    0        0        1        0
 1    2018-05-24 12:00:00    0        0        1        0
 0    2018-05-24 20:00:00    0        0        1        0
 0    2018-05-25 00:00:00    0        0        0        1
 1    2018-05-25 00:00:00    0        0        0        1
 2    2018-05-25 00:00:00    0        0        0        1
 0    2018-05-25 04:00:00    0        0        0        1
 0    2018-05-25 08:00:00    0        0        0        1

Я хотел бы взять индекс 'one' иget:

one  time                   id_1  id_2  id_3 day_...    
 2    2018-05-24 00:00:00    0     0     1    0
 1    2018-05-24 12:00:00    0     1     0    0
 0    2018-05-24 20:00:00    1     0     0    0
 0    2018-05-25 00:00:00    1     0     0    1
 1    2018-05-25 00:00:00    0     1     0    1
 2    2018-05-25 00:00:00    0     0     1    1
 0    2018-05-25 04:00:00    1     0     0    1
 0    2018-05-25 08:00:00    1     0     0    1

где id_'#' - закодированные индексы из 'one'

Я пытался кодировать его с помощью:

conc_ohlc_dummies= pandas.get_dummies(conc_ohlc['one'], prefix= 'hours')

, но получаюэта ошибка:

return self._engine.get_loc (self._maybe_cast_indexer (key)) Файл "pandas_libs \ index.pyx", строка 140, в файле pandas._libs.index.IndexEngine.get_loc "pandas_libs \ index.pyx ", строка 162, в файле pandas._libs.index.IndexEngine.get_loc" pandas_libs \ hashtable_class_helper.pxi ", строка 1492, в файле pandas._libs.hashtable.PyObjectHashTable.get_lip_lib_lib_lib_lib_lib_lib_lib_lib_lib_lib_px, строка 1500, в pandas._libs.hashtable.PyObjectHashTable.get_item KeyError: 'one'

Я также пытался переиндексировать его, чтобы исключить значения индекса.Есть ли другой способ, кроме записи в csv и повторного открытия для этого?

спасибо всем

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Изначально я пытался использовать метод .reindex (), чтобы исключить любую индексацию в фреймах данных, но обнаружил, что .reset_index () сработал.После индексации .get_dummies () и .merge () закодировали и добавили информацию обратно во фрейм для меня.Мне пришлось снова установить индекс, а затем отсортировать его по порядку:

    thisthing= thisthing.reset_index()
    thisthing_dummies= pandas.get_dummies(thisthing['one'], prefix='hours', drop_first=True)
    thisthing= thisthing.merge(thisthing_dummies, left_index=True, right_index=True)
    thisthing= thisthing.set_index(['time','one'])
    thisthing.sort_values(by=['time', 'one'],inplace=True)
0 голосов
/ 25 сентября 2018

Вы можете использовать OneHotEncoder форму sklearn.

. Давайте начнем с некоторого стандартного кода:

 import pandas as pd
 import numpy as np
 from sklearn.preprocessing import OneHotEncoder
 df = pd.DataFrame({"one":[2,1,0,0,1,2], "abcd":[4,6,3,6,7,1]})
 print(df)

   one  abcd
0    2     4
1    1     6
2    0     3
3    0     6
4    1     7
5    2     1

Теперь вы можете установить один объект горячего энкодера с этими значениями ...

ohe = OneHotEncoder()
ohe.fit( df.one.values.reshape(-1, 1) )
vals = ohe.transform( df.one.values.reshape(-1, 1) ).toarray()
print(vals)

array([[0., 0., 1.],
       [0., 1., 0.],
       [1., 0., 0.],
       [1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])

Теперь просто вставьте их во фрейм данных:

for i in range(vals.shape[1]):
    df['id_{}'.format(i)] = vals[:, i]

Конечный фрейм данных должен выглядеть следующим образом:

   one  abcd  id_0  id_1  id_2
0    2     4   0.0   0.0   1.0
1    1     6   0.0   1.0   0.0
2    0     3   1.0   0.0   0.0
3    0     6   1.0   0.0   0.0
4    1     7   0.0   1.0   0.0
5    2     1   0.0   0.0   1.0
...