Преобразование значений столбца для группы строк фрейма данных в список в столбце - PullRequest
1 голос
/ 12 июля 2020

Для этого вопроса возьмем следующий пример. У меня есть фрейм данных, который выглядит следующим образом (df.head()):

   Unnamed: 0  PacketTime  FrameLen  FrameCapLen  ...  Speed  Delay  Loss  Interval
0           1    0.056078       116          116  ...     25      0     0         0
1           2    0.056106        66           66  ...     25      0     0         0
2           3    2.058089       116          116  ...     25      0     0         2
3           4    2.058115        66           66  ...     25      0     0         2
4           5    4.060316       116          116  ...     25      0     0         4

[5 rows x 23 columns]

Как вы можете видеть, группы расположены по столбцу Interval. Я знаю, что pandas имеет df.groupby(colname), но мне нужно sh сгруппировать строки интервала, чтобы значения столбцов были перечислены вместе. Это даст следующий пример вывода:

   Unnamed: 0  PacketTime  FrameLen  FrameCapLen  ...  Speed  Delay  Loss  Interval
0           1    0.000028       116,66          116,66  ...     25,25      0,0     0,0         0
1           2    0.000026        116,66           116,66  ...     25,25      0,0     0,0         2
...

[5 rows x 23 columns]

Как видите, желаемый конечный результат состоит в том, чтобы столбцы были сгруппированы в список для групп интервалов, а время пакета было объединено таким образом, чтобы значение составляет max(PacketTime)-min(PacketTime) для каждой группы интервалов.

1 Ответ

1 голос
/ 12 июля 2020

Это две отдельные задачи. Для обоих воспользуемся тем фактом, что операция 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       |




Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...