回答編集履歴

1

コード修正

2020/12/08 08:15

投稿

8524ba23
8524ba23

スコア38341

test CHANGED
@@ -1,4 +1,6 @@
1
1
  集計結果と元のデータを、値をキーにして左結合するとよいかと思います。
2
+
3
+ そのさい、各グループごとに結合できるようにグループ番号を利用します。
2
4
 
3
5
  なお、最大値が複数ある場合は複数行表示されます。
4
6
 
@@ -22,9 +24,9 @@
22
24
 
23
25
  2020-12-01 02:01,12
24
26
 
25
- 2020-12-01 03:00,14
27
+ 2020-12-01 03:00,13
26
28
 
27
- 2020-12-01 03:01,14"""
29
+ 2020-12-01 03:01,13"""
28
30
 
29
31
  df = pd.read_csv(StringIO(s))
30
32
 
@@ -32,20 +34,30 @@
32
34
 
33
35
 
34
36
 
35
- df_max = df.groupby(pd.Grouper(key='date', freq='1H')).max().reset_index()
37
+ grp = df.groupby(pd.Grouper(key='date', freq='1H'))
36
38
 
39
+ df['grp_no'] = grp.ngroup() # グループ番号を付与
40
+
41
+
42
+
43
+ df_max = grp.max().reset_index()
44
+
45
+ df_max['grp_no'] = df_max.index # グループ番号を付与
46
+
47
+
48
+
37
- df_ret = pd.merge(df_max, df, on='val', how='left').dropna()
49
+ df_ret = pd.merge(df_max, df, on=['grp_no','val'], how='left').dropna()
38
50
 
39
51
  print(df_ret)
40
52
 
41
- # date_x val date_y
53
+ # date_x val grp_no date_y
42
54
 
43
- #0 2020-12-01 01:00:00 11 2020-12-01 01:01:00
55
+ #0 2020-12-01 01:00:00 11 0 2020-12-01 01:01:00
44
56
 
45
- #1 2020-12-01 02:00:00 13 2020-12-01 02:00:00
57
+ #1 2020-12-01 02:00:00 13 1 2020-12-01 02:00:00
46
58
 
47
- #2 2020-12-01 03:00:00 14 2020-12-01 03:00:00
59
+ #2 2020-12-01 03:00:00 13 2 2020-12-01 03:00:00
48
60
 
49
- #3 2020-12-01 03:00:00 14 2020-12-01 03:01:00
61
+ #3 2020-12-01 03:00:00 13 2 2020-12-01 03:01:00
50
62
 
51
63
  ```