回答編集履歴
3
修正
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'] =
|
45
|
+
df['n'] = df.groupby('name')['status'].cumcount() - (df['status'] == 'ED')
|
42
46
|
|
43
|
-
# 一つのSTに対応するEDが複数あるケースでは必要に応じてdrop_duplicates
|
44
|
-
|
45
|
-
#df = df.
|
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
|
-
od
|
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
|
-
#
|
91
|
+
#4 airo NaN NaN ED 2020-01-03 00:00:35
|
88
92
|
|
89
|
-
#
|
93
|
+
#5 kkkk ST 2020-01-04 01:10:10 ED 2020-01-05 01:10:30
|
90
94
|
|
91
|
-
#
|
95
|
+
#6 eiro ST 2020-01-05 02:10:20 ED 2020-01-05 02:20:30
|
92
96
|
|
93
97
|
```
|
2
ソートの追加
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 sir
|
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
修正
test
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
nameでグループ化して、ST毎にカウントアップする列を作れば、その値を使ってSTに対応するEDを取り出せます。
|
2
2
|
|
3
|
-
|
3
|
+
この処理はgroupbyとcumsumでできます。
|
4
4
|
|
5
5
|
|
6
6
|
|
@@ -38,7 +38,7 @@
|
|
38
38
|
|
39
39
|
|
40
40
|
|
41
|
-
df['n'] = df
|
41
|
+
df['n'] = (df['status'] == 'ST').groupby(df['name']).cumsum()
|
42
42
|
|
43
43
|
# 一つのSTに対応するEDが複数あるケースでは必要に応じてdrop_duplicates
|
44
44
|
|