Как переставить этот pandas фрейм данных? - PullRequest
0 голосов
/ 14 апреля 2020

Прямо сейчас у меня есть данные для трех стихов. Каждое стихотворение имеет 4 метрики (поэтому столбцы AD для первого стиха, столбцы EH для второго стиха, столбцы IL для третьего). Каждая строка содержит оценки от одного человека (поэтому строка 1 будет содержать оценки человека 1 для стихов 1, 2 и 3 соответственно, а строка 2 будет содержать оценки человека 2).

Текущий формат Я хочу изменить форму моего фрейма данных, чтобы в нем было только четыре столбца (1 на метрию c), со строками, соответствующими каждому стихотворению, например: Желаемый формат

1 Ответ

0 голосов
/ 14 апреля 2020

Предположим, что источник df был создан как:

df = pd.DataFrame(np.arange(1,25).reshape(2, -1),
    columns=[ 'Metric ' + x for x in list('ABCD') ] * 3)

, поэтому он содержит:

   Metric A  Metric B  Metric C  Metric D  Metric A  Metric B  Metric C  Metric D  Metric A  Metric B  Metric C  Metric D
0         1         2         3         4         5         6         7         8         9        10        11        12
1        13        14        15        16        17        18        19        20        21        22        23        24

Чтобы преобразовать его из "широкого" в " длинный "формат, вы можете запустить, например:

df2 = pd.DataFrame(df.values.reshape(-1, 4), columns=df.columns[0:4],
    index=[ 'Poem ' + x for x in list('123') ] * df.index.size)

получение:

        Metric A  Metric B  Metric C  Metric D
Poem 1         1         2         3         4
Poem 2         5         6         7         8
Poem 3         9        10        11        12
Poem 1        13        14        15        16
Poem 2        17        18        19        20
Poem 3        21        22        23        24

Другое решение

Вы также можете сделать это и другим способом:

df.T.set_index(pd.MultiIndex.from_product(
    [['Poem ' + x for x in list('123')], df.columns[0:4]])).T\
   .stack(level=0).reset_index(level=0, drop=True)
...