[英]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.