Pandas - сводная и переставленная таблица с несколькими метками в одном заголовке - PullRequest
1 голос
/ 15 февраля 2020

У меня есть файл xlsx с вкладками для данных за несколько лет. Каждая вкладка содержит таблицу со многими столбцами, и таблица структурирована следующим образом:

+-----------+-------+-------------------------+----------------------+
|   City    | State | Number of Drivers, 2019 | Number of Cars, 2019 |
+-----------+-------+-------------------------+----------------------+
| LA        | CA    |                     123 |                 10.0 |
| San Diego | CA    |                     456 |                 2345 |
+-----------+-------+-------------------------+----------------------+

Я хотел бы переставить таблицу так, чтобы она выглядела следующим образом, и сделайте это для каждой вкладки в xlsx:

+-----------+-------+------+-------------------+---------------+
|   City    | State | Year |   Measure Name    | Measure Value |
+-----------+-------+------+-------------------+---------------+
| LA        | CA    | 2019 | Number of Drivers |           123 |
| San Diego | CA    | 2019 | Number of Drivers |           456 |
| LA        | CA    | 2019 | Number of Cars    |            10 |
| San Diego | CA    | 2019 | Number of Cars    |          2345 |
+-----------+-------+------+-------------------+---------------+

Есть много движущихся частей, и было немного сложно получить правильное окончательное форматирование.

Ответы [ 2 ]

2 голосов
/ 15 февраля 2020

Мы делаем melt, затем join с str.split

s=df.melt(['City','State'])
s=s.join(s.variable.str.split(',',expand=True))
Out[120]: 
       City State              variable   value                0     1
0        LA    CA  NumberofDrivers,2019   123.0  NumberofDrivers  2019
1  SanDiego    CA  NumberofDrivers,2019   456.0  NumberofDrivers  2019
2        LA    CA     NumberofCars,2019    10.0     NumberofCars  2019
3  SanDiego    CA     NumberofCars,2019  2345.0     NumberofCars  2019

# if you need change the name adding .rename(columns={}) at the end 
0 голосов
/ 16 февраля 2020

Так я смог применить решение Йобена к каждой вкладке в файле xlsx, сложить их вместе и записать полную таблицу в файл .csv:

sheets_dict = pd.read_excel(r'file.xlsx', sheet_name=None)

full_table = pd.DataFrame()
for name, sheet in sheets_dict.items():
    sheet['sheet'] = name
    sheet = sheet.melt(['City','State'])
    sheet = sheet.join(sheet.variable.str.split(',' , expand=True))
    full_table = full_table.append(sheet)


full_table.reset_index(inplace=True, drop=True)


full_table.to_csv('Full Table.csv')
...