回答編集履歴

3

修正

2021/10/25 02:08

投稿

bsdfan
bsdfan

スコア4794

test CHANGED
@@ -1,6 +1,10 @@
1
- nameでグループ化して、ST毎にカウントアップする列を作れば、その値を使ってSTに対応するEDを取り出せます。
1
+ ~~nameでグループ化して、ST毎にカウントアップする列を作れば、その値を使ってSTに対応するEDを取り出せます。
2
2
 
3
- この処理はgroupbyとcumsumでできます。
3
+ この処理はgroupbyとcumsumでできます。~~
4
+
5
+ nameでグループ化して、statusをカウントアップして、EDの場合はそこから1ひく処理をすれば、その値を使ってSTに対応するEDを取り出せます。
6
+
7
+ (最初の回答だとEDが連続するケースがあった場合が違う出力になるので修正しました。そういうケースがないならどちらでもいいです。)
4
8
 
5
9
 
6
10
 
@@ -38,11 +42,9 @@
38
42
 
39
43
 
40
44
 
41
- df['n'] = (df['status'] == 'ST').groupby(df['name']).cumsum()
45
+ df['n'] = df.groupby('name')['status'].cumcount() - (df['status'] == 'ED')
42
46
 
43
- # 一つのSTに対応するEDが複数あるケースでは必要に応じてdrop_duplicates
44
-
45
- #df = df.drop_duplicates(['name', 'status', 'n'])
47
+ #df['n'] = (df['status'] == 'ST').groupby(df['name']).cumsum()
46
48
 
47
49
  ```
48
50
 
@@ -72,7 +74,9 @@
72
74
 
73
75
  ```python
74
76
 
75
- odf = odf.loc[odf['dtime1'].fillna(odf['dtime2']).sort_values().index]
77
+ sort_idx = odf['dtime1'].fillna(odf['dtime2']).sort_values().index
78
+
79
+ odf = odf.reindex(sort_idx).reset_index(drop=True)
76
80
 
77
81
  # name status1 dtime1 status2 dtime2
78
82
 
@@ -84,10 +88,10 @@
84
88
 
85
89
  #3 eiro ST 2020-01-02 00:00:25 ED 2020-01-02 00:00:30
86
90
 
87
- #6 airo NaN NaN ED 2020-01-03 00:00:35
91
+ #4 airo NaN NaN ED 2020-01-03 00:00:35
88
92
 
89
- #4 kkkk ST 2020-01-04 01:10:10 ED 2020-01-05 01:10:30
93
+ #5 kkkk ST 2020-01-04 01:10:10 ED 2020-01-05 01:10:30
90
94
 
91
- #5 eiro ST 2020-01-05 02:10:20 ED 2020-01-05 02:20:30
95
+ #6 eiro ST 2020-01-05 02:10:20 ED 2020-01-05 02:20:30
92
96
 
93
97
  ```

2

ソートの追加

2021/10/25 02:08

投稿

bsdfan
bsdfan

スコア4794

test CHANGED
@@ -52,7 +52,7 @@
52
52
 
53
53
  STだけのデータフレーム、EDだけのデータフレームを作って、nameと上で作った列でouter mergeします。
54
54
 
55
- - STがないairoの行が下になってしまいます
55
+ - ~~STがないairoの行が下になってしまいます~~
56
56
 
57
57
  - NoneではなくNaNが入っています
58
58
 
@@ -66,9 +66,17 @@
66
66
 
67
67
  odf = odf.drop(columns='n')
68
68
 
69
+ ```
70
+
71
+ dtime1がない行をdtime2の値を使うようにしてソートします。
72
+
73
+ ```python
74
+
75
+ odf = odf.loc[odf['dtime1'].fillna(odf['dtime2']).sort_values().index]
76
+
69
77
  # name status1 dtime1 status2 dtime2
70
78
 
71
- #0 siro ST 2020-01-01 00:00:05 NaN NaN
79
+ #0 siri ST 2020-01-01 00:00:05 NaN NaN
72
80
 
73
81
  #1 siro ST 2020-01-01 00:00:10 ED 2020-01-01 00:00:15
74
82
 
@@ -76,10 +84,10 @@
76
84
 
77
85
  #3 eiro ST 2020-01-02 00:00:25 ED 2020-01-02 00:00:30
78
86
 
87
+ #6 airo NaN NaN ED 2020-01-03 00:00:35
88
+
79
89
  #4 kkkk ST 2020-01-04 01:10:10 ED 2020-01-05 01:10:30
80
90
 
81
91
  #5 eiro ST 2020-01-05 02:10:20 ED 2020-01-05 02:20:30
82
92
 
83
- #6 airo NaN NaN ED 2020-01-03 00:00:35
84
-
85
93
  ```

1

修正

2021/10/24 11:30

投稿

bsdfan
bsdfan

スコア4794

test CHANGED
@@ -1,6 +1,6 @@
1
1
  nameでグループ化して、ST毎にカウントアップする列を作れば、その値を使ってSTに対応するEDを取り出せます。
2
2
 
3
- 前半の処理はgroupbyとcumsumでできます。
3
+ の処理はgroupbyとcumsumでできます。
4
4
 
5
5
 
6
6
 
@@ -38,7 +38,7 @@
38
38
 
39
39
 
40
40
 
41
- df['n'] = df.groupby('name')['status'].apply(lambda s: (s == 'ST').cumsum())
41
+ df['n'] = (df['status'] == 'ST').groupby(df['name']).cumsum()
42
42
 
43
43
  # 一つのSTに対応するEDが複数あるケースでは必要に応じてdrop_duplicates
44
44