簡體   English   中英

大熊貓:根據閾值將數據幀分為多個數據幀

[英]Pandas: splitting dataframe into multiple dataframe based on threshold value

我有這樣的數據框

                 Transport  Elapsed_Time     gap_time        gap_minutes 
0                  taxi         556.0   0 days 00:00:02          0.0 
1                  walk          95.0   0 days 00:53:34         53.0 
2                  taxi          44.0   0 days 02:02:00        122.0 
3                  taxi           2.0   0 days 17:05:56       1025.0 
4                  walk          73.0   0 days 00:14:31         14.0 
5                  boat          10.0   0 days 00:02:16          2.0 
6                  walk          34.0   0 days 00:00:42          0.0 
7                  boat           8.0   0 days 00:00:54          0.0 
8                 walk          37.0   0 days 00:07:25          7.0 
9                 boat          30.0   0 days 00:00:23          0.0 
10                 walk         105.0   0 days 00:04:59          4.0
11                 taxi          14.0   0 days 00:01:06          1.0
12                 walk          31.0   0 days 18:01:32       1081.0
13                 taxi          10.0   0 days 01:06:11         66.0
14                train          41.0   0 days 16:59:25       1019.0
15                 walk           3.0   0 days 00:02:28          2.0
16                 taxi         137.0 276 days 23:49:58       1429.0

我喜歡根據gap_minutes> 20的閾值將數據幀分為多個數據幀

結果數據幀看起來像這樣

df1:

0                  taxi         556.0   0 days 00:00:02          0.0 
1                  walk          95.0   0 days 00:53:34         53.0 

df2:

2                  taxi          44.0   0 days 02:02:00        122.0 

df3:

3                  taxi           2.0   0 days 17:05:56       1025.0 

df4:

4                  walk          73.0   0 days 00:14:31         14.0 
5                  boat          10.0   0 days 00:02:16          2.0 
6                  walk          34.0   0 days 00:00:42          0.0 
7                  boat           8.0   0 days 00:00:54          0.0 
8                 walk          37.0   0 days 00:07:25          7.0 
9                 boat          30.0   0 days 00:00:23          0.0 
10                 walk         105.0   0 days 00:04:59          4.0
11                 taxi          14.0   0 days 00:01:06          1.0
12                 walk          31.0   0 days 18:01:32       1081.0

df5:

13                 taxi          10.0   0 days 01:06:11         66.0 

df6:

14                train          41.0   0 days 16:59:25       1019.0 

df7:

15                 walk           3.0   0 days 00:02:28          2.0 
16                 taxi         137.0 276 days 23:49:58       1429.0 

讓我們嘗試一下,在這種情況下,“ listofdf”是鍵為1到7的數據幀字典。 首先讓我們確保gap-time為pd.TimeDelta dtype,然后進行分組:

df.gap_time = pd.to_timedelta(df.gap_time)
g = df.groupby((df.gap_time / pd.Timedelta('20 minutes')).ge(1)[::-1].cumsum())
for n,g in g:
    listofdf[n] = g

輸出:

print(listofdf[1])

       Transport  Elapsed_Time          gap_time  gap_minutes
15      walk           3.0   0 days 00:02:28          2.0
16      taxi         137.0 276 days 23:49:58       1429.0

print(listofdf[2])

   Transport  Elapsed_Time gap_time  gap_minutes
14     train          41.0 16:59:25       1019.0

print(listofdf[7])

  Transport  Elapsed_Time gap_time  gap_minutes
0      taxi         556.0 00:00:02          0.0
1      walk          95.0 00:53:34         53.0

這個怎么運作:

弄清楚它是如何工作的最好方法是將有問題的陳述分成幾部分。 第一,

讓我們找出哪個間隔大於20,因此,如果將gap_time除以20分鍾,並且得到的值大於或等於1,那么我們知道需要開始一個新的組。

(df.gap_time / pd.Timedelta('20 minutes')).ge(1)

輸出:

0     False
1      True
2      True
3      True
4     False
5     False
6     False
7     False
8     False
9     False
10    False
11    False
12     True
13     True
14     True
15    False
16     True
Name: gap_time, dtype: bool

這是技巧部分,現在,我想將所有“假”記錄與以下“真”記錄分組。 查看gap_time和您的邏輯。 為此,我們需要顛倒記錄的順序,然后使用cumsum 對於每個真實記錄,總和基本上都會增加。 因此,true等於1,然后所有錯誤記錄將變為1,直到下一個真實記錄變為2,而所有錯誤記錄將變為2,直到下一個真實記錄。

(df.gap_time / pd.Timedelta('20 minutes')).ge(1)[::-1].cumsum()

輸出:

16    1
15    1
14    2
13    3
12    4
11    4
10    4
9     4
8     4
7     4
6     4
5     4
4     4
3     5
2     6
1     7
0     7
Name: gap_time, dtype: int64

使用這個新系列作為將數據幀分組的一種方法,因此我們在上述系列中使用g = groupby。

暫無
暫無

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

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