[英]Convert a column in a data frame that has values as a list of lists as numeric
[英]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.