Python 按时间序列将大熊猫数据帧拆分为小熊猫数据帧

Python 按时间序列将大熊猫数据帧拆分为小熊猫数据帧,python,pandas,time-series,Python,Pandas,Time Series,我有一个包含38个时间序列的熊猫数据帧。每个时间序列从0开始到1结束,一个以秒为单位的数字列在0到1之间,这是关于每个时间序列从何处开始到何处结束的唯一提示 我想分割原始df int 38数据帧 我想我可以简单地在行上循环并执行检查,直到值达到1s,然后分割,但我想知道是否有更聪明、最快的方法来实现这一点?总有一天我会有38000个时间序列 数据帧看起来像: 行¦var1¦var2¦。。。阿尔法时间 第1行¦x¦y。。。α0.0 第100排×100×100Ω。。。α1.0 第101排¦x101

我有一个包含38个时间序列的熊猫数据帧。每个时间序列从0开始到1结束,一个以秒为单位的数字列在0到1之间,这是关于每个时间序列从何处开始到何处结束的唯一提示

我想分割原始df int 38数据帧

我想我可以简单地在行上循环并执行检查,直到值达到1s,然后分割,但我想知道是否有更聪明、最快的方法来实现这一点?总有一天我会有38000个时间序列

数据帧看起来像:

行¦var1¦var2¦。。。阿尔法时间

第1行¦x¦y。。。α0.0

第100排×100×100Ω。。。α1.0

第101排¦x101¦y101¦。。。α0.0

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

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

[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()
,我们实际上是在为groupby创建一个列。此处显示的列为
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
然后我们基本上按列s分组(即使我们从未创建列s)。因为每个组本质上都是一个数据帧,所以您有单独的数据帧

如果我们使用
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

谢谢你的提示@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()
,我们实际上是在为groupby创建一个列。此处显示的列为
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
然后我们基本上按列s分组(即使我们从未创建列s)。因为每个组本质上都是一个数据帧,所以您有单独的数据帧

如果我们使用
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

try
df.groupby(df.time.eq(1.shift().fillna(0.cumsum())
@abolotnov)可能重复,我想说这不是重复,因为那个人想按相同的日期分组。我不想按列的相同值进行分组。try
df.groupby(df.time.eq(1.shift().fillna(0.cumsum())
@abolotnov可能重复,因为那个人想按相同的日期进行分组。我不想按列的相同值分组。我不确定这是否真的有效-它似乎没有存储第二个1和0之间的所有数据。它确实适用于第一个数据帧,但在某个点上它开始混合行,我不确定为什么…你能解释一下它是如何工作的吗?这或许有助于理解可能出现的问题:)@jotNewie您能再提供几行数据吗?如果您的数据组织得很好,这应该会起作用。
[0,0.2,0,4,0.6,0.8,1,0,…]
(间距是不相关的),但有几种方法可以打破这一点。还刚刚意识到使用
df.time.eq(0.cumsum()
进行分组可能更简单。也许结尾不是真正的1,但开头总是真正的0?@ALollz你说得对,我的一些原始行在原始文件中已经被打乱了,这让我很困惑。但是代码运行得非常好,我不确定这是否真的有效-它似乎没有存储第二个1和0之间的所有数据。它确实适用于第一个数据帧,但在某个点上它开始混合行,我不确定为什么…你能解释一下它是如何工作的吗?这或许有助于理解可能出现的问题:)@jotNewie您能再提供几行数据吗?如果您的数据组织得很好,这应该会起作用。
[0,0.2,0,4,0.6,0.8,1,0,…]
(间距是不相关的),但有几种方法可以打破这一点。还刚刚意识到使用
df.time.eq(0.cumsum()
进行分组可能更简单。也许结尾不是真正的1,但开头总是真正的0?@ALollz你说得对,我的一些原始行在原始文件中已经被打乱了,这让我很困惑。但是代码运行得非常好