Python 熊猫:基于阈值将数据帧拆分为多个数据帧
我有这样的数据帧Python 熊猫:基于阈值将数据帧拆分为多个数据帧,python,pandas,Python,Pandas,我有这样的数据帧 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
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\u minutes>20的阈值将数据帧划分为多个数据帧
生成的数据帧如下所示
df1:
df2:
df3:
df4:
df5:
df6:
df7:
让我们试试这个,“listofdf”是一个数据帧字典,在本例中,键为1到7。首先,让我们确保间隙时间为pd.TimeDelta数据类型,然后是组:
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
。
.
工作原理:
弄清楚它是如何工作的最好方法是把有问题的陈述分成几个部分。首先,
让我们计算出哪些间隔大于20,因此如果将间隔时间除以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
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
这是诀窍部分,现在,我想将所有“假”记录与以下“真”记录分组。查看gap\u time
和您的逻辑。为此,我们需要颠倒记录的顺序,然后使用cumsum
。Cumsum基本上为每个真实记录递增。所以,true等于1,那么所有的假记录得到1,直到下一个真记录变成2,所有的假记录得到2,直到下一个真记录
(df.gap_time / pd.Timedelta('20 minutes')).ge(1)[::-1].cumsum()
输出:
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
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。您希望分区如何工作?它似乎不依赖于间隔分钟数,因为此列中具有相同值的所有元素都不会在同一部分中结束。每当间隔分钟数>20时,它应该创建新分区。虽然代码可以工作,但我也希望从概念上理解它是如何工作的。特别是第二个语句,g=df.groupby((df.gap_time/pd.Timedelta('20分钟')).ge(1)[:-1].cumsum()),尤其是它的最后一部分。ge(1)[::-1].cumsum()。@AsifKhan I补充了一个解释。希望有帮助。
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
(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
(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