сводная таблица для расширенного фрейма данных в Python / Pandas - PullRequest
0 голосов
/ 03 апреля 2020

Я хочу построить на моем предыдущем вопросе .

Давайте посмотрим на некоторый код Python.

import numpy as np
import pandas as pd
mat = np.array([[1,2,3],[4,5,6]])
df_mat = pd.DataFrame(mat)
df_mat_tidy = (df_mat.stack()
                    .rename_axis(index = ['V1','V2'])
                    .rename('value')
                    .reset_index()
                    .reindex(columns = ['value','V1','V2']))
df_mat_tidy

Это берет меня из опоры table (mat) в «аккуратную» (в смысле Tidyverse) версию данных, которая дает одну переменную как столбец, из которого пришло число, одну переменную как строку, из которой пришло число, и одну переменную как число в сводная таблица в позиции строки-столбца.

Теперь я хочу расширить это, чтобы пара строк-столбцов повторяла количество раз, которое указывается в сводной таблице. Другими словами, если позиция 1,1 имеет значение 3, а позиция 2,1 имеет значение 4, я хочу, чтобы кадр данных был go

col row
 1   1
 1   1
 1   1
 1   2
 1   2
 1   2
 1   2

вместо

col row value
 1   1    3
 1   2    4

Я думаю, что я знаю, как l oop по строкам второго примера и произвести это, но я хочу что-то более быстрое.

Есть ли способ «растопить» сводную таблицу так, как я описываю

Ответы [ 2 ]

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

Вы можете просто перестроить DataFrame из понимания:

pd.DataFrame([i for j in [[[rec['V1'], rec['V2']]] * rec['value']
                  for rec in df_mat_tidy.to_dict(orient='records')]
          for i in j], columns=['col', 'row'])

Это дает, как и ожидалось:

    col  row
0     0    0
1     0    1
2     0    1
3     0    2
4     0    2
5     0    2
6     1    0
7     1    0
8     1    0
9     1    0
10    1    1
11    1    1
12    1    1
13    1    1
14    1    1
15    1    2
16    1    2
17    1    2
18    1    2
19    1    2
20    1    2
0 голосов
/ 03 апреля 2020

Посмотрите на части pandas документов, озаглавленных "Изменение формы и сводные таблицы" .

Обе .pivot(), .pivot_table() и .melt() - все существующие функции. Похоже, вы заново изобретаете некоторые колеса.

...