Pandas Melt с многоиндексным набором данных и сбросом индекса - почему это работает? - PullRequest
0 голосов
/ 24 декабря 2018

Я создал этот набор данных прямо из документации pandas:

In [28]: columns = pd.MultiIndex.from_tuples([('A', 'cat'), ('B', 'dog'),
   ....:                                      ('B', 'cat'), ('A', 'dog')],
   ....:                                     names=['exp', 'animal'])
   ....: 

In [29]: index = pd.MultiIndex.from_product([('one', 'two'),
                                             ('bar', 'baz', 'foo', 'qux')
   ....:                                     ],
   ....:                                    names=['first', 'second'])
   ....: 

In [30]: df = pd.DataFrame(np.random.randn(8, 4), index=index, columns=columns)

Набор данных MultiIndex (для столбцов и строк) выглядит следующим образом:

enter image description here

Я хотел бы получить что-то вроде этого [изображение обрезано, но вы получите точку]

enter image description here

Возможно, естьмиллионы способов изменить это, но я хочу сделать это, используя unstack () и melt ()

Вот два способа, которыми я придумал:

    1. pd.melt(df.reset_index(),id_vars=['first','second'])
    2. pd.melt(df.unstack().reset_index(),id_vars=['first'])

Так вот гдеЯ застрял: Почему это работает?

df.reset_index() дает мне этот кадр данных

enter image description here

сэти столбцы

enter image description here

'first' и 'second' не отображаются в именах столбцов.Они являются фактическими уровнями колонки опыта.Поэтому мне стало интересно, что произойдет, если я добавлю больше уровней к id_vars в расплаве

Если я изменю расплав на

pd.melt(df.reset_index(),id_vars=['first','second','A'])

, я получу следующую ошибку:

ValueError: все массивы должны быть одинаковой длины

Если я изменяю расплав на

pd.melt(df.reset_index(),id_vars=['first','second','dog'])

, я получаю следующую ошибку:

KeyError: 'dog'

Может кто-нибудь объяснить, что интуитивно происходит под капотом с помощью reset_index () и почему таяние не принимает другие уровни?Почему «первый» и «второй» отображаются в виде уровней вместо столбцов?

1 Ответ

0 голосов
/ 24 декабря 2018

Существует функция с именем stack

yourdf=df.stack([0,1]).reset_index(name='value')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...