У меня есть этот фрейм данных:
дф
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.
Есть идеи, что я здесь делаю неправильно?
Вы можете рассчитать используемую скорость интерфейса перед поворотом таблицы, а затем использовать 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
@ user1471980 Да, вы можете использовать df['Date'] = pd.to_datetime(df['Date']).dt.strftime('%d-%b')
перед поворотом таблицы.
Я знаю, что принял ваш ответ, но быстрый вопрос. Есть ли способ отсортировать даты так, чтобы после сводной таблицы я видел даты слева направо?
@ user1471980 Они уже должны быть в порядке возрастания, независимо от исходного порядка строк. Если вы имеете в виду спуск, вы можете сделать df = df.sort_index(axis=1, ascending=False)
после поворота.
Есть ли способ переименовать имена столбцов, сформированных по дате, в имя дня и месяца, например, 1 июня, 10 июня?