回答編集履歴

4

修正

2024/07/03 03:28

投稿

bsdfan
bsdfan

スコア4774

test CHANGED
@@ -1,6 +1,6 @@
1
1
  追記の追記
2
2
  --------
3
- コメントにて、並べ替えの方法が提示されましたが、想定している並べ替え方と違うため、下記回答ではできません。
3
+ コメントにて、並べ替えの方法が提示されましたが、想定している並べ替え方と違うため、下記回答ではできないケースがあるかもしれません。
4
4
 
5
5
  追記
6
6
  ----

3

修正の修正

2024/07/03 03:22

投稿

bsdfan
bsdfan

スコア4774

test CHANGED
@@ -1,6 +1,22 @@
1
+ 追記の追記
2
+ --------
3
+ コメントにて、並べ替えの方法が提示されましたが、想定している並べ替え方と違うため、下記回答ではできません。
4
+
1
5
  追記
2
6
  ----
7
+ もとのdfがちゃんと並んでいるわけではなく、こちらで整列の方法も考える必要があるみたいです。できるだけ連番ができるようにしてみました。
8
+
9
+ ```python
10
+ df['n'] = df.groupby(['居住地', '勤務地', 'day']).cumcount()
11
+ df = df.sort_values(['居住地', '勤務地', 'n', 'day']).drop(columns='n')
12
+
13
+ consecutive = ((df['居住地'] == df['居住地'].shift(1))
14
+ & (df['勤務地'] == df['勤務地'].shift(1))
15
+ & (df['day'] - df['day'].shift(1) == 1))
16
+
17
+ df['uniqueid'] = (~consecutive).cumsum()
18
+ ```
3
- コメンにて、並べ替えの方法が提示されましたが、想定している並べ替方と違うため、下記回答ではできません。
19
+ 元の回答とは、ソートの方法を変えただけです。(コード省略のため、uniquid 連番のまます)
4
20
 
5
21
  元の回答
6
22
  ---------

2

修正

2024/07/03 02:35

投稿

bsdfan
bsdfan

スコア4774

test CHANGED
@@ -1,20 +1,6 @@
1
1
  追記
2
2
  ----
3
- もとのdfがちゃんと並んでいるわけではなく、こちらで整列の方法も考える必要があるみたいです。
4
- できるだけ連番ができるようにしてみました。
5
-
6
- ```python
7
- df['n'] = df.groupby(['居住地', '勤務地', 'day']).cumcount()
8
- df = df.sort_values(['居住地', '勤務地', 'n', 'day']).drop(columns='n')
9
-
10
- consecutive = ((df['居住地'] == df['居住地'].shift(1))
11
- & (df['勤務地'] == df['勤務地'].shift(1))
12
- & (df['day'] - df['day'].shift(1) == 1))
13
-
14
- df['uniqueid'] = (~consecutive).cumsum()
15
- ```
16
- 元の回答とはソートの方法を変えただけです。(コード省略のため、uniquid 連番のまです)
3
+ コメントにて並べ替えの方法が提示されましたが、想定している並べ替方と違うため、下記回答でできせん。
17
-
18
4
 
19
5
  元の回答
20
6
  ---------

1

ソートの変更

2024/07/03 02:28

投稿

bsdfan
bsdfan

スコア4774

test CHANGED
@@ -1,3 +1,23 @@
1
+ 追記
2
+ ----
3
+ もとのdfがちゃんと並んでいるわけではなく、こちらで整列の方法も考える必要があるみたいです。
4
+ できるだけ連番ができるようにしてみました。
5
+
6
+ ```python
7
+ df['n'] = df.groupby(['居住地', '勤務地', 'day']).cumcount()
8
+ df = df.sort_values(['居住地', '勤務地', 'n', 'day']).drop(columns='n')
9
+
10
+ consecutive = ((df['居住地'] == df['居住地'].shift(1))
11
+ & (df['勤務地'] == df['勤務地'].shift(1))
12
+ & (df['day'] - df['day'].shift(1) == 1))
13
+
14
+ df['uniqueid'] = (~consecutive).cumsum()
15
+ ```
16
+ 元の回答とは、ソートの方法を変えただけです。(コード省略のため、uniquid は連番のままです)
17
+
18
+
19
+ 元の回答
20
+ ---------
1
21
  質問やコメントにある、同じ uniqueid を割り振る条件がちょっと曖昧なので、勝手な想像で
2
22
  - もとの df を [居住地, 勤務地] で stable なソートをしたデータで、
3
23
  - 居住地、勤務地が同じで、day が連番になっているかたまり