Pandas: объединение нескольких таблиц в одну и подсчет вхождений

#python #pandas #pivot-table

#python #pandas #сводная таблица

Вопрос:

Я пытаюсь создать сводную таблицу, которая объединяет несколько (более 8) фреймов данных в один.

В таблицах несколько столбцов, но здесь я буду упрощать:

 Table1

week        project 
42          ABC
42          FGA
42          ZTR
44          HTZ
44          UZR
44          LOP
46          POL
46          ZTT
46          ART
46          ART
...
 

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

Единственный общий столбец для всех таблиц — это столбец недели. В некоторых таблицах больше или меньше столбцов, также заголовки столбцов могут отличаться. Столбец недели является единственным общим столбцом для всех и, как я полагаю, здесь достаточно для использования исключительно.

Моя цель — подсчитать количество вхождений во всех таблицах за неделю. В конечном счете, я хотел бы достичь:

 index  table1  table2  table3  table4  table5
42       3       3       4       11      23
43       0       4       10      15      7
44       3       12      8       9       1
45       0       7       0       0       8
46       4       6       7       0       22
47       8       3       12      6       0
 

Такой подсчет был бы довольно простым в Excel, просто используя сводную таблицу с подсчетом.
Как бы я поступил в таком сценарии на Python?

Комментарии:

1. Используйте concat для создания одного фрейма данных, который включает все, и используйте pivot_table для получения результата

Ответ №1:

Вы можете использовать concat с keys аргументом и последующим groupby unstack .

Здесь следует отметить, что при выводе ключа вручную было бы лучше, если бы у каждой таблицы был идентификатор, показывающий, из какого источника он получен.

 tables = [df1,df2] # if you want to make the keys dynamic, 
#tables = table_dict = dict(zip([f'table {i}' for i in range(1,len(tables)   1)],tables))

df_new = (
    pd.concat(tables, axis=0, keys=["table1", "table2"])
    .set_index("week", append=True)
    .groupby(level=[0, 2])
    .count()
    .unstack(0)
)

     project       
      table1 table2
week               
42         3      3
44         3      3
46         4      4
 

Комментарии:

1. Спасибо. однако происходит нечто довольно странное. Я получаю двухуровневый заголовок столбца. Первый уровень представляет собой все столбцы из таблицы 1 (неделя, проект, владелец, дата), второй уровень представляет собой повторение моей желаемой сводной таблицы (цифры верны, но повторяются для каждого столбца table1 снова и снова).

2. привет @Botan пожалуйста, предоставьте образец, который имитирует ваш ввод / вывод, и я с радостью помогу. Сложно написать решение, используя только догадки.