我有一个包含38个时间序列的熊猫数据框。每个时间序列从0s开始,以1s完成,一个以秒为单位的时间在0到1之间的数字列是我唯一知道每个时间序列在哪里开始和在哪里结束的提示。
我想分割原始的df int 38个数据帧。
我想我可以简单地遍历行并执行检查,直到值达到1s,然后拆分,但是我想知道是否有更聪明,最快的方法吗?到某个时候,我将有38.000个时间序列...
数据框看起来像:
行φ1var1φ2...时间
第1行x x y ... ... 0.0
。
第100行x100 x100 x1.0 ...
第101行¦ x101��y101��... ¦ 0.0
。
我想在第100行中拆分df,以使第101行是新的不同数据帧的第一行。我将在给定的df中重复此过程38次。
我的问题与[1]不同,因为在这种情况下,此人想要按相同的日期值分组,而在我的情况下,我不想按相同的值分组。
答案 0 :(得分: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()
,我们实际上是在创建一列以供分组依据。此处显示为列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