Это две отдельные задачи. Для обоих воспользуемся тем фактом, что операция groupby , которая выполняет следующий процесс :
Разбивает один фрейм данных на несколько фреймов данных на основе одного столбца. Применить операцию к каждому фрейму данных. Сшиваем полученные кадры данных вместе.
Первое задание:
Имейте одну строку на интервал для всех столбцов, кроме PacketTime - где каждое значение представляет собой список из двух values.
Мы хотим сшить все в список. Так что давайте для этого используем series.to_list()
. По неизвестной мне причине позвонить по номеру df.apply(lambda s: s.to_list() )
не получится. Pandas автоматически преобразует список обратно в обычные столбцы - однако вызов этого для строк возвращает то, что нам нужно: серию списков. Таким образом, мы преобразуем столбцы в строки, применим to_list к строкам (которые являются бывшими столбцами).
Пример
df.T.apply(lambda series: series.to_list(), axis='columns')
приводит к:
PacketTime [0.056078, 0.056106, 2.058089, 2.058115, 4.060...
FrameLen [116.0, 66.0, 116.0, 66.0, 116.0]
FrameCapLen [116.0, 66.0, 116.0, 66.0, 116.0]
Unnamed: 3 [nan, nan, nan, nan, nan]
Speed [25.0, 25.0, 25.0, 25.0, 25.0]
Delay [0.0, 0.0, 0.0, 0.0, 0.0]
Loss [0.0, 0.0, 0.0, 0.0, 0.0]
Interval [0.0, 0.0, 2.0, 2.0, 4.0]
Это точно что мы хотим для каждого интервала. Итак, давайте определим его как функцию и применим ее к каждому интервалу, верно?!
import pandas as pd
df = pd.read_excel('example.xlsx')
def to_list(df):
return df.T.apply(lambda x: x.to_list(), axis='columns')
df_other = df.groupby('Interval')\
.apply(to_list)\
.drop(columns='PacketTime')
Вторая задача:
Для расчета продолжительности все, что нам нужно - это функция, которая берет минимум времени и максимум времени и выводит их как длину времени:
def min_max(s):
return s.max()-s.min()
Теперь мы просто применяем ее и объединяем две dfs вместе:
s_Interval = df.groupby('Interval')['PacketTime']\
.apply(min_max)
final_df = pd.concat([df_other,s_Interval], axis= 'columns')
Получаем:
print(final_df.to_markdown())
| Interval | FrameLen | FrameCapLen | Unnamed: 3 | Speed | Delay | Loss | Interval | PacketTime |
|-----------:|:--------------|:--------------|:-------------|:-------------|:-----------|:-----------|:-----------|-------------:|
| 0 | [116.0, 66.0] | [116.0, 66.0] | [nan, nan] | [25.0, 25.0] | [0.0, 0.0] | [0.0, 0.0] | [0.0, 0.0] | 2.8e-05 |
| 2 | [116.0, 66.0] | [116.0, 66.0] | [nan, nan] | [25.0, 25.0] | [0.0, 0.0] | [0.0, 0.0] | [2.0, 2.0] | 2.6e-05 |
| 4 | [116.0] | [116.0] | [nan] | [25.0] | [0.0] | [0.0] | [4.0] | 0 |