簡體   English   中英

將一組數據框行的列值轉換為列中的列表

[英]Convert column values for a group of data frame rows into a list in the column

對於這個問題,我們來看下面的例子。 我有一個 dataframe 如下所示( 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) ,但我想做的是對間隔行進行分組,以便列值一起列出。 這將給出一個示例 output 如下:

   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)

這是兩個獨立的任務。 對於兩者,讓我們使用執行以下過程的 groupby 操作這一事實:

基於單個列將單個數據框拆分為多個數據框。 對每個數據框應用操作。 將生成的數據幀拼接在一起。

第一份工作:

除 PacketTime 之外的所有列的每個間隔都有一行 - 其中每個值都是兩個值的列表。

我們想把東西縫合到一個列表中。 所以讓我們使用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]

這正是我們想要的每個區間。 因此,讓我們將其定義為 function 並將其應用於每個間隔,對吧?!


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')

第二份工作:

為了計算持續時間,我們只需要一個 function,它取最短時間和最長時間並推導出它們的時間長度:

     
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       |




暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM