【问题标题】:Pandas: splitting dataframe into multiple dataframe based on threshold valuePandas:根据阈值将数据帧拆分为多个数据帧
【发布时间】:2018-05-05 01:07:48
【问题描述】:

我有这样的数据框

                 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 

【问题讨论】:

  • 您希望分区如何工作?它似乎不依赖于 gap_minutes,因为此列中具有相同值的所有元素都不会在同一部分结束
  • 每当 gap_minutes>20 时,它应该创建新分区。

标签: python pandas


【解决方案1】:

让我们试试这个,'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。 Cumsum 基本上为每个真实记录递增。所以,true 等于 1,那么所有的 false 记录都得到 1,直到下一个 true 记录变为 2,所有 false 记录得到 2,直到下一个 true 记录。

(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 上述系列。

【讨论】:

  • 虽然代码有效,但我也希望从概念上理解它是如何工作的。尤其是第二个语句,g = df.groupby((df.gap_time / pd.Timedelta('20 minutes')).ge(1)[::-1].cumsum()),尤其是最后一部分.ge (1)[::-1].cumsum()).
  • @AsifKhan 我添加了解释。希望对您有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-29
  • 2019-05-31
  • 1970-01-01
  • 1970-01-01
  • 2019-08-20
  • 2021-02-24
  • 2023-02-05
相关资源
最近更新 更多