Как создать группу сводных таблиц по дате и выполнить расчет по двум значениям в pandas?

У меня есть этот фрейм данных:

дф

Node      Interface    Speed   Band_In  carrier     Date
Server1   wan1         100     80       ATT         2024-06-01
Server1   wan2         100     60       Sprint      2024-06-01
Server1   wan3         100     96       Verizon     2024-06-01
Server2   wan1         100     80       ATT         2024-06-01
Server2   wan2         100     60       ATT         2024-06-01
Server2   wan3         100     96       ATT         2024-06-01
Server3   wan1         100     80       ATT         2024-06-01
Server3   wan2         100     60       ATT         2024-06-01
Server3   wan3         100     96       ATT         2024-06-01
Server4   wan1         100     80       ATT         2024-06-01
Server4   wan2         100     60       ATT         2024-06-01
Server5   Int3         100     96       Verizon     2024-06-01
Server1   wan1         100     30       ATT         2024-06-10
Server1   wan2         100     30       Sprint      2024-06-10
Server1   wan3         100     15       Verizon     2024-06-10
Server2   wan1         100     80       ATT         2024-06-10
Server2   wan2         100     60       ATT         2024-06-10
Server2   wan3         100     96       ATT         2024-06-10
Server3   wan1         100     80       ATT         2024-06-10
Server3   wan2         100     60       ATT         2024-06-10
Server3   wan3         100     96       ATT         2024-06-10
Server4   wan1         100     80       ATT         2024-06-10
Server4   wan2         100     60       ATT         2024-06-10
Server5   Int3         100     96       Verizon     2024-06-10

Мне нужно, чтобы этот фрейм данных был реорганизован, где каждая дата uniq должна быть в отдельном столбце, а используемая скорость интерфейса (Band_In/Speed) * 100 рассчитывается по каждому узлу, интерфейсу, оператору связи и дате (дата должна быть месяцем и днем ​​имени : например, 1 июня, 10 июня)

Должно быть что-то вроде этого:

дф1:

Node      Interface    Speed   Band_In  carrier     1-Jun            10-Jun
Server1   wan1         100     80       ATT         80               30
Server1   wan2         100     60       Sprint      60               30
Server1   wan3         100     96       Verizon     96               15

Я попробовал это:

 df1=df.pivot(index=['Node', 'Interface', 'Speed', 'Band_In', 'carrier'], columns='Date', values='Speed'/'Interface'*100).fillna('').reset_index()

Я получаю длину переданных значений i 11 456, индекс подразумевает 5.

Есть идеи, что я здесь делаю неправильно?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете рассчитать используемую скорость интерфейса перед поворотом таблицы, а затем использовать pivot_table:

df['is'] = df['Band_In'] / df['Speed'] * 100
df = df.pivot_table(index=['Node', 'Interface', 'carrier'], columns='Date', values='is').reset_index()
Date     Node Interface  carrier  2024-06-01  2024-06-10
0     Server1      wan1      ATT        80.0        30.0
1     Server1      wan2   Sprint        60.0        30.0
2     Server1      wan3  Verizon        96.0        15.0
3     Server2      wan1      ATT        80.0        80.0
4     Server2      wan2      ATT        60.0        60.0
5     Server2      wan3      ATT        96.0        96.0
6     Server3      wan1      ATT        80.0        80.0
7     Server3      wan2      ATT        60.0        60.0
8     Server3      wan3      ATT        96.0        96.0
9     Server4      wan1      ATT        80.0        80.0
10    Server4      wan2      ATT        60.0        60.0
11    Server5      Int3  Verizon        96.0        96.0

Есть ли способ переименовать имена столбцов, сформированных по дате, в имя дня и месяца, например, 1 июня, 10 июня?

user1471980 23.07.2024 20:26

@ user1471980 Да, вы можете использовать df['Date'] = pd.to_datetime(df['Date']).dt.strftime('%d-%b') перед поворотом таблицы.

e-motta 23.07.2024 20:32

Я знаю, что принял ваш ответ, но быстрый вопрос. Есть ли способ отсортировать даты так, чтобы после сводной таблицы я видел даты слева направо?

user1471980 23.07.2024 22:08

@ user1471980 Они уже должны быть в порядке возрастания, независимо от исходного порядка строк. Если вы имеете в виду спуск, вы можете сделать df = df.sort_index(axis=1, ascending=False) после поворота.

e-motta 24.07.2024 01:38

Другие вопросы по теме