Индекс мульти панды из столбцов - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть такой фрейм данных:

          index        A   B   C                  
     01.01.2000        a1  b1  c1
     01.02.2000        a2  b2  c2
     01.03.2000        a3  b3  c3

, и я хотел бы получить это:

              index      X
     (0, 01.01.2000)     a1
     (0, 01.02.2000)     a2
     (0, 01.03.2000)     a3
     (1, 01.01.2000)     b1
     (1, 01.02.2000)     b2
     (1, 01.03.2000)     b3
     (2, 01.01.2000)     c1
     (2, 01.02.2000)     c2
     (2, 01.03.2000)     c3

Мне нужен этот способ для прогона данных через некоторые модели регрессии.К сожалению, документы для панд по мультииндексированию очень смущают меня, так как я новичок в этом.Спасибо!

Ответы [ 4 ]

0 голосов
/ 14 февраля 2019

Можно попытаться получить категориальные коды столбцов с последующим наложением и преобразованием индекса в кортеж

df.columns = df.columns.to_series().astype('category').cat.codes
df1 = df.stack().reorder_levels([1,0]).sort_index()
df1.index = tuple(df1.index)

Out:

(0, 01.01.2000)    a1
(0, 01.02.2000)    a2
(0, 01.03.2000)    a3
(1, 01.01.2000)    b1
(1, 01.02.2000)    b2
(1, 01.03.2000)    b3
(2, 01.01.2000)    c1
(2, 01.02.2000)    c2
(2, 01.03.2000)    c3
dtype: object

** Редактировать **

Сортировка данных по уровням индекса

df.index  = pd.to_datetime(df.index)
df.columns = df.columns.to_series().astype('category').cat.codes
df1 = df.stack().reorder_levels([1,0]).sort_index(level=1)
df1.index = tuple(df1.index)

Out:

(0, 2000-01-01 00:00:00)    a1
(1, 2000-01-01 00:00:00)    b1
(2, 2000-01-01 00:00:00)    c1
(0, 2000-01-02 00:00:00)    a2
(1, 2000-01-02 00:00:00)    b2
(2, 2000-01-02 00:00:00)    c2
(0, 2000-01-03 00:00:00)    a3
(1, 2000-01-03 00:00:00)    b3
(2, 2000-01-03 00:00:00)    c3
dtype: object
0 голосов
/ 14 февраля 2019

Понимание

pd.DataFrame([
    [(i, idx), v]
    for i, (idx, *V) in enumerate(df.itertuples())
    for v in V
], columns=['index', 'X'])

             index   X
0  (0, 01.01.2000)  a1
1  (0, 01.01.2000)  b1
2  (0, 01.01.2000)  c1
3  (1, 01.02.2000)  a2
4  (1, 01.02.2000)  b2
5  (1, 01.02.2000)  c2
6  (2, 01.03.2000)  a3
7  (2, 01.03.2000)  b3
8  (2, 01.03.2000)  c3
0 голосов
/ 14 февраля 2019

Немного иначе,

new_df = df.set_index('index', append=True).stack().droplevel(2)
new_df.index = tuple(zip(new_df.index))
new_df = new_df.reset_index().rename(columns = {'level_0': 'index', 0:'X'})

    index           X
0   (0, 01.01.2000) a1
1   (0, 01.01.2000) b1
2   (0, 01.01.2000) c1
3   (1, 01.02.2000) a2
4   (1, 01.02.2000) b2
5   (1, 01.02.2000) c2
6   (2, 01.03.2000) a3
7   (2, 01.03.2000) b3
8   (2, 01.03.2000) c3
0 голосов
/ 14 февраля 2019

Вам нужно reset_index два раза, тогда просто выполните melt

s=df.reset_index().reset_index().melt(['level_0','index'])
yourdf=pd.DataFrame({'index':tuple(zip(s['level_0'],s['index'])),'X':s.value})
yourdf
Out[130]: 
             index   X
0  (0, 01.01.2000)  a1
1  (1, 01.02.2000)  a2
2  (2, 01.03.2000)  a3
3  (0, 01.01.2000)  b1
4  (1, 01.02.2000)  b2
5  (2, 01.03.2000)  b3
6  (0, 01.01.2000)  c1
7  (1, 01.02.2000)  c2
8  (2, 01.03.2000)  c3
...