Задать вопрос
@LakeForest

Как транспонировать таблицу в пандасе так, чтобы даты стали группирующей колонкой над всем, кроме времени?

Исходная таблица:
|-------------|--------|-----------|------------------|
| дата-------| часы  | процент | опрошенных |
|-------------|--------|-----------|------------------|
| 23-01-01 | 10:00 | 10.2-----| 20--------------|
|-------------|--------|-----------|-----------------|
| 23-01-01 | 11:00 | 11.2-----| 27--------------|
|-------------|--------|-----------|-----------------|
| 24-01-01 | 10:00 | 22.2-----| 40--------------|
|-------------|--------|-----------|-----------------|
| 24-01-01 | 11:00 | 42.2-----| 12--------------|


Необходимо получить таблицу вида:
|--------|------------------------------|-----------------------------|
| дата--| 23-01-01------------------| 24-01-01-----------------|
|--------|------------------------------|-----------------------------|
| часы  | процент | опрошенных | процент | опрошенных  |
|--------|-----------|------------------|-----------|------------------|
| 10:00 | 10.2-----| 20--------------| 22.2-----| 40---------------|
|--------|-----------|------------------|-----------|------------------|
| 11:00 | 11.2-----| 27--------------| 42.2-----| 12---------------|
| AVG   | 10.7 .....


Дошел до того, чтобы через groupby сделать по дате и времени, но время отрисовывается опять же для каждой даты:
df.groupby(['дата', 'часы']).mean()

Может кто-нибудь знает изящный способ быстро преобразовать таблицу к нужной структуре?
  • Вопрос задан
  • 752 просмотра
Подписаться 1 Простой 3 комментария
Решения вопроса 1
Maksim_64
@Maksim_64
Data Analyst
import pandas as pd
#создаю такую же таблицу как у тебя
df = pd.DataFrame({
    'Дата':['23-01-01','23-01-01','24-01-01','24-01-01'],
    'Часы':['10:00','11:00','10:00','11:00'],
    'Процент':[10.2,11.2,22.2,42.2],
    'Опрошенных':[20,27,40,12]
})
#само решение
reshaped_df = df.pivot(index=['Дата'],columns='Часы',values=['Процент','Опрошенных'])\
    .swaplevel(axis=1).T.reset_index()\
    .pivot(index='Часы',columns='level_1')
reshaped_df.columns.names = ['Дата',None]
print(reshaped_df)


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

Да у тебя порядок [процент, опрошенных, процент, опрошенных] а у меня [опрошенных, процент, опрошенных, процент] на данные сами числа естественно полностью совпадают. Если это играет какую-то роль то столбцовые мульти-индексы сам подправишь. А в остальном полная копия твоей таблицы.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы