【问题标题】:Split large pandas data frame into smaller one as per time series根据时间序列将大熊猫数据框拆分为较小的数据框
【发布时间】:2019-09-06 14:28:49
【问题描述】:

我有一个包含 38 个时间序列的 pandas 数据框。每个时间序列从 0 秒开始,在 1 秒结束,时间序列在 0 到 1 之间的秒数列是我对每个时间序列的开始位置和结束位置的唯一提示。

我想将原来的 df int 38 个数据帧拆分。

我想我可以简单地遍历行并执行检查,直到值达到 1s 然后拆分,但我想知道是否有更智能和最快的方法来做到这一点?在某个时候,我将拥有 38.000 个时间序列......

数据框看起来像:

行 ¦ var1 ¦ var2 ¦... ¦ 时间

第 1 行 ¦ x ¦ y ¦ ... ¦ 0.0

.

第 100 行 ¦ x100 ¦ y100 ¦ ... ¦ 1.0

第 101 行 ¦ x101 ¦ y101 ¦ ... ¦ 0.0

.

我想拆分第 100 行中的 df,这样第 101 行是新的不同数据帧的第一行。我会在给定的 df 内重复这个过程 38 次。

我的问题与 [1] 不同,因为在这种情况下,该人希望按相同的日期值分组,而在我的情况下,我不想按相同的值分组。

[1] Splitting dataframe into multiple dataframes

【问题讨论】:

  • 试试df.groupby(df.time.eq(1).shift().fillna(0).cumsum())
  • @abolotnov 我会说这不是重复的,因为那个人想按同一日期分组。我不想按列的相同值进行分组。

标签: python pandas time-series


【解决方案1】:

感谢@Alollz 的提示

group=[]
for k,g in df.groupby(df.time.eq(1).shift().fillna(0).cumsum()):
    group.append(g)

您可以拨打您需要的群组

group[0] , group[1] , group[2]....

详情

起始数据帧

row     var1    var2    time
row1    x1       y1     0
row2    x2       y2     0
row3    x3       y3     0
row4    x4       y4     0
row5    x5       y5     0
row6    x6       y6     0
row7    x7       y7     0
row8    x8       y8     1
row9    x9       y9     0
row10   x10     y10     0
row11   x11     y11     0
row12   x12     y12     0
row13   x13     y13     0
row14   x14     y14     1
row15   x15     y15     0
row16   x16     y16     0
row17   x17     y17     0
row18   x18     y18     0

使用df.time.eq(1).shift().fillna(0).cumsum(),我们实际上是在为我们创建一个列来分组。此处显示列s

row     var1    var2    time    s
row1    x1       y1     0       0
row2    x2       y2     0       0
row3    x3       y3     0       0
row4    x4       y4     0       0
row5    x5       y5     0       0
row6    x6       y6     0       0
row7    x7       y7     0       0
row8    x8       y8     1       0
row9    x9       y9     0       1
row10   x10     y10     0       1
row11   x11     y11     0       1
row12   x12     y12     0       1
row13   x13     y13     0       1
row14   x14     y14     1       1
row15   x15     y15     0       2
row16   x16     y16     0       2
row17   x17     y17     0       2
row18   x18     y18     0       2

然后我们基本上对列进行分组(即使我们从未创建列)。由于每个组本质上都是一个数据框,因此您有单独的数据框。

如果我们使用df.time.eq(1).fillna(0).cumsum(),我们的行会在下一个数据帧中变为 1。 s2列中显示的分组数据

    row     var1    var2 time   s   s2
0   row1    x1       y1     0   0   0
1   row2    x2       y2     0   0   0
2   row3    x3       y3     0   0   0
3   row4    x4       y4     0   0   0
4   row5    x5       y5     0   0   0
5   row6    x6       y6     0   0   0
6   row7    x7       y7     0   0   0
7   row8    x8       y8     1   0   1
8   row9    x9       y9     0   1   1
9   row10   x10     y10     0   1   1
10  row11   x11     y11     0   1   1
11  row12   x12     y12     0   1   1
12  row13   x13     y13     0   1   1
13  row14   x14     y14     1   1   2
14  row15   x15     y15     0   2   2
15  row16   x16     y16     0   2   2
16  row17   x17     y17     0   2   2
17  row18   x18     y18     0   2   2

【讨论】:

  • 我不确定这是否真的有效 - 它似乎没有存储第二个 1 和 0 之间的所有数据。它确实适用于第一个数据帧,但在某些时候它开始混合行,我不知道为什么......
  • 你能解释一下它应该如何工作吗?这可能有助于理解可能出了什么问题:)
  • @jotNewie 你能再提供几行数据吗?如果您的数据组织良好[0, 0.2, 0,4, 0.6, 0.8, 1, 0, ...](间距无关紧要),这应该有效,但有几种方法可能会破坏。也刚刚意识到与df.time.eq(0).cumsum() 分组可能更简单。也许结束不是真正的 1,但开始总是真正的 0?
  • @ALollz 你是对的,我的一些原始行在原始文件中已经混乱了,这让我感到困惑。但是代码工作得很好
猜你喜欢
  • 1970-01-01
  • 2016-11-16
  • 2013-06-23
  • 2018-12-04
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多