とりあえずこんな感じで書けます
グループID を1からふるのが意外と面倒くさいです
Python
1import pandas as pd
2import io
3
4data="""
5,datetime,val
60,2018-10-18T00:00:00,350
71,2018-10-18T00:00:10,350
82,2018-10-18T00:00:11,350
93,2018-10-18T00:00:12,350
104,2018-10-18T00:00:13,350
115,2018-10-18T00:00:14,350
126,2018-10-18T00:00:15,350
137,2018-10-18T00:00:16,350
148,2018-10-18T00:00:17,350
159,2018-10-18T00:00:18,350
1610,2018-10-18T00:00:19,350
1711,2018-10-18T00:01:00,350
1812,2018-10-18T00:01:44,350
1913,2018-10-18T00:01:45,350
2014,2018-10-18T00:01:46,350
2115,2018-10-18T00:01:47,350
2216,2018-10-18T00:01:48,350
2317,2018-10-18T00:01:49,350
2418,2018-10-18T00:01:50,350
2519,2018-10-18T00:01:51,350
2620,2018-10-18T00:01:52,350
2721,2018-10-18T00:01:53,38
2822,2018-10-18T00:02:00,38
2923,2018-10-18T00:03:00,38
3024,2018-10-18T00:03:14,38
3125,2018-10-18T00:03:15,38
3226,2018-10-18T00:03:16,38
3327,2018-10-18T00:03:17,38
3428,2018-10-18T00:03:18,38
3529,2018-10-18T00:03:19,38
3630,2018-10-18T00:03:20,38
3731,2018-10-18T00:03:21,38
3832,2018-10-18T00:03:22,38
3933,2018-10-18T00:03:23,0
40"""
41
42df = pd.read_csv(io.StringIO(data),index_col=0,parse_dates=['datetime'])
43# 1秒より大きく間隔が開いている箇所でグループ分け
44df['grp'] = (df.datetime.diff() > pd.Timedelta('1 sec')).cumsum()
45# 条件1:グループのサイズが1より大きい
46cond1 = (df.groupby('grp').size() > 1)
47# 条件2:条件1に加えグループないで値に変動がある
48tmp = df.groupby('grp')['val'].apply(lambda d: d.max() != d.min())
49cond2 = pd.concat([cond1,tmp],axis=1).all(axis=1)
50# 条件1用のグループIDをふる
51grp_id1 = df[df.grp.map(cond1)].groupby('grp').ngroup().rename('grp1') + 1
52# 条件2用のグループIDをふる
53grp_id2 = df[df.grp.map(cond2)].groupby('grp').ngroup().rename('grp2') + 1
54# 作成したグループIDを元のデータと
55print(pd.concat([df,grp1,grp2], axis=1))
56# datetime val grp grp1 grp2
57#0 2018-10-18 00:00:00 350 0 NaN NaN
58#1 2018-10-18 00:00:10 350 1 1.0 NaN
59#2 2018-10-18 00:00:11 350 1 1.0 NaN
60#3 2018-10-18 00:00:12 350 1 1.0 NaN
61#4 2018-10-18 00:00:13 350 1 1.0 NaN
62#5 2018-10-18 00:00:14 350 1 1.0 NaN
63#6 2018-10-18 00:00:15 350 1 1.0 NaN
64#7 2018-10-18 00:00:16 350 1 1.0 NaN
65#8 2018-10-18 00:00:17 350 1 1.0 NaN
66#9 2018-10-18 00:00:18 350 1 1.0 NaN
67#10 2018-10-18 00:00:19 350 1 1.0 NaN
68#11 2018-10-18 00:01:00 350 2 NaN NaN
69#12 2018-10-18 00:01:44 350 3 2.0 1.0
70#13 2018-10-18 00:01:45 350 3 2.0 1.0
71#14 2018-10-18 00:01:46 350 3 2.0 1.0
72#15 2018-10-18 00:01:47 350 3 2.0 1.0
73#16 2018-10-18 00:01:48 350 3 2.0 1.0
74#17 2018-10-18 00:01:49 350 3 2.0 1.0
75#18 2018-10-18 00:01:50 350 3 2.0 1.0
76#19 2018-10-18 00:01:51 350 3 2.0 1.0
77#20 2018-10-18 00:01:52 350 3 2.0 1.0
78#21 2018-10-18 00:01:53 38 3 2.0 1.0
79#22 2018-10-18 00:02:00 38 4 NaN NaN
80#23 2018-10-18 00:03:00 38 5 NaN NaN
81#24 2018-10-18 00:03:14 38 6 3.0 2.0
82#25 2018-10-18 00:03:15 38 6 3.0 2.0
83#26 2018-10-18 00:03:16 38 6 3.0 2.0
84#27 2018-10-18 00:03:17 38 6 3.0 2.0
85#28 2018-10-18 00:03:18 38 6 3.0 2.0
86#29 2018-10-18 00:03:19 38 6 3.0 2.0
87#30 2018-10-18 00:03:20 38 6 3.0 2.0
88#31 2018-10-18 00:03:21 38 6 3.0 2.0
89#32 2018-10-18 00:03:22 38 6 3.0 2.0
90#33 2018-10-18 00:03:23 0 6 3.0 2.0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/26 02:48