回答編集履歴

5

2024/07/03 07:49

投稿

melian
melian

スコア20283

test CHANGED
@@ -24,13 +24,11 @@
24
24
  df = pd.read_csv(io.StringIO(csv_data))
25
25
 
26
26
  #
27
- uid = [uuid4() for _ in range(len(df))]
27
+ uid_iter = (uuid4() for _ in range(len(df)))
28
- uid_iter = iter(uid)
29
28
  cols = df.columns.to_list()
30
29
  df['cumcount'] = df.groupby(cols).cumcount()
31
30
  df['uniqueid'] = df.groupby(['居住地', '勤務地', 'cumcount'], sort=False)['cumcount'].transform(lambda _: next(uid_iter))
32
- l = len(uid) - len([*uid_iter])
33
- df = df.set_index('uniqueid').loc[uid[:l]].reset_index()[[*cols, 'uniqueid']]
31
+ df = df.set_index('uniqueid').loc[df['uniqueid'].unique()].reset_index()[[*cols, 'uniqueid']]
34
32
 
35
33
  print(df)
36
34
  ```

4

uuid4() 版に書き換え

2024/07/03 07:42

投稿

melian
melian

スコア20283

test CHANGED
@@ -1,15 +1,7 @@
1
- > 【実現したいこと】の別の言い方になります。
2
- > 以下の【df】のデータを上からなめていき、
3
- > 「居住地」「勤務地」がそれぞれ同一で、「day」が15のデータに”abc123”のダミーデータを「uniqueid」列に割り当てます。
4
- > :
5
- >
6
- > 「居住地」「勤務地」がそれぞれ同一で、「day」が15のデータに”abc456”のダミーデータを「uniqueid」列に割り当て、以降、同じことを繰り返します。
7
-
8
- 最初に `pandas.core.groupby.DataFrameGroupBy.cumcount()` で「居住地」「勤務地」「day」が同一の行に出現順で連番(cumcount)を付与して、次に「居住地」「勤務地」「cumcount」でグループ化して uniqueid を割り当てます。
9
-
10
1
  ```python
11
2
  import pandas as pd
12
3
  import io
4
+ from uuid import uuid4
13
5
 
14
6
  csv_data = '''
15
7
  居住地,勤務地,day
@@ -32,32 +24,14 @@
32
24
  df = pd.read_csv(io.StringIO(csv_data))
33
25
 
34
26
  #
35
- uid = ['abc123', 'aabbcc', 'abc456', 'abc789', 'efg123', 'efg456', 'efg789']
27
+ uid = [uuid4() for _ in range(len(df))]
36
28
  uid_iter = iter(uid)
37
29
  cols = df.columns.to_list()
38
- cum_cols = ['居住地', '勤務地', 'cumcount']
39
30
  df['cumcount'] = df.groupby(cols).cumcount()
40
- df['uniqueid'] = df.groupby(cum_cols, sort=False)['cumcount'].transform(lambda _: next(uid_iter))
31
+ df['uniqueid'] = df.groupby(['居住地', '勤務地', 'cumcount'], sort=False)['cumcount'].transform(lambda _: next(uid_iter))
32
+ l = len(uid) - len([*uid_iter])
41
- df = df.set_index('uniqueid').loc[uid].reset_index()[cols + ['uniqueid']]
33
+ df = df.set_index('uniqueid').loc[uid[:l]].reset_index()[[*cols, 'uniqueid']]
42
34
 
43
35
  print(df)
44
36
  ```
45
37
 
46
- | 居住地 | 勤務地 | day | uniqueid |
47
- |---------:|---------:|------:|:-----------|
48
- | 111111 | 112233 | 15 | abc123 |
49
- | 111111 | 112233 | 16 | abc123 |
50
- | 111111 | 112233 | 17 | abc123 |
51
- | 111111 | 112233 | 15 | aabbcc |
52
- | 111111 | 112233 | 16 | aabbcc |
53
- | 111111 | 112233 | 17 | aabbcc |
54
- | 928845 | 817264 | 15 | abc456 |
55
- | 200980 | 200121 | 15 | abc789 |
56
- | 200980 | 200121 | 16 | abc789 |
57
- | 548192 | 556119 | 15 | efg123 |
58
- | 548192 | 556119 | 16 | efg123 |
59
- | 548192 | 556119 | 17 | efg123 |
60
- | 178260 | 178227 | 16 | efg456 |
61
- | 178260 | 178227 | 17 | efg456 |
62
- | 333704 | 333882 | 17 | efg789 |
63
-

3

2024/07/03 04:49

投稿

melian
melian

スコア20283

test CHANGED
@@ -1,66 +1,63 @@
1
+ > 【実現したいこと】の別の言い方になります。
2
+ > 以下の【df】のデータを上からなめていき、
1
- 以下`uniqueid` は `uuid.uuid4()` で生成します。(Pandas のバージョンは `2.2.2`)
3
+ > 「居住地」「勤務地」がそれぞれ同一で「day」が15のデータに”abc123”のダミーデータを「uniqueid」列に割り当てます。
4
+ > :
5
+ >
6
+ > 「居住地」「勤務地」がそれぞれ同一で、「day」が15のデータに”abc456”のダミーデータを「uniqueid」列に割り当て、以降、同じことを繰り返します。
7
+
8
+ 最初に `pandas.core.groupby.DataFrameGroupBy.cumcount()` で「居住地」「勤務地」「day」が同一の行に出現順で連番(cumcount)を付与して、次に「居住地」「勤務地」「cumcount」でグループ化して uniqueid を割り当てます。
2
9
 
3
10
  ```python
4
11
  import pandas as pd
5
12
  import io
6
- from uuid import uuid4
7
13
 
8
14
  csv_data = '''
9
- id,居住地,勤務地,day
15
+ 居住地,勤務地,day
10
- aa1,111111,112233,15
16
+ 111111,112233,15
11
- aa2,111112,112231,15
17
+ 111111,112233,15
12
- aa3,111113,112232,15
13
- aa4,111114,112234,15
18
+ 928845,817264,15
19
+ 200980,200121,15
14
- aa5,111115,112235,15
20
+ 548192,556119,15
15
- aa6,111116,112236,15
16
- bb1,111111,112233,16
21
+ 111111,112233,16
17
- bb3,111113,112232,16
22
+ 111111,112233,16
18
- bb5,111115,112235,16
23
+ 178260,178227,16
24
+ 200980,200121,16
19
- bb6,111116,112236,16
25
+ 548192,556119,16
20
- cc1,111111,112233,17
26
+ 111111,112233,17
21
- cc3,111113,112232,17
27
+ 111111,112233,17
22
- cc5,111115,112235,17
28
+ 178260,178227,17
29
+ 333704,333882,17
30
+ 548192,556119,17
23
31
  '''
24
32
  df = pd.read_csv(io.StringIO(csv_data))
25
33
 
26
34
  #
35
+ uid = ['abc123', 'aabbcc', 'abc456', 'abc789', 'efg123', 'efg456', 'efg789']
36
+ uid_iter = iter(uid)
37
+ cols = df.columns.to_list()
27
- df = df.groupby(['居住地', '勤務地'])\
38
+ cum_cols = ['居住地', '勤務地', 'cumcount']
28
- .apply(lambda x: x.assign(uniqueid=uuid4()), include_groups=False)\
39
+ df['cumcount'] = df.groupby(cols).cumcount()
40
+ df['uniqueid'] = df.groupby(cum_cols, sort=False)['cumcount'].transform(lambda _: next(uid_iter))
29
- .reset_index()[[*df.columns]+['uniqueid']]
41
+ df = df.set_index('uniqueid').loc[uid].reset_index()[cols + ['uniqueid']]
30
42
 
31
43
  print(df)
32
44
  ```
33
45
 
34
- | id | 居住地 | 勤務地 | day | uniqueid |
46
+ | 居住地 | 勤務地 | day | uniqueid |
35
- |:-----|---------:|---------:|------:|:-------------------------------------|
47
+ |---------:|---------:|------:|:-----------|
36
- | aa1 | 111111 | 112233 | 15 | 7dac6c94-7526-45f1-a74a-76af595a400e |
48
+ | 111111 | 112233 | 15 | abc123 |
37
- | bb1 | 111111 | 112233 | 16 | 7dac6c94-7526-45f1-a74a-76af595a400e |
49
+ | 111111 | 112233 | 16 | abc123 |
38
- | cc1 | 111111 | 112233 | 17 | 7dac6c94-7526-45f1-a74a-76af595a400e |
50
+ | 111111 | 112233 | 17 | abc123 |
39
- | aa2 | 111112 | 112231 | 15 | 2003f6a2-4d24-4f4d-986b-3b0db50d965e |
40
- | aa3 | 111113 | 112232 | 15 | ccc77569-cbe5-4d62-8e54-b4a98c6d43c4 |
41
- | bb3 | 111113 | 112232 | 16 | ccc77569-cbe5-4d62-8e54-b4a98c6d43c4 |
42
- | cc3 | 111113 | 112232 | 17 | ccc77569-cbe5-4d62-8e54-b4a98c6d43c4 |
43
- | aa4 | 111114 | 112234 | 15 | 5f91dab6-480e-4954-94fe-fb665e418886 |
44
- | aa5 | 111115 | 112235 | 15 | 6e89292b-e97d-4933-b173-9cecc4901c91 |
51
+ | 111111 | 112233 | 15 | aabbcc |
45
- | bb5 | 111115 | 112235 | 16 | 6e89292b-e97d-4933-b173-9cecc4901c91 |
52
+ | 111111 | 112233 | 16 | aabbcc |
46
- | cc5 | 111115 | 112235 | 17 | 6e89292b-e97d-4933-b173-9cecc4901c91 |
53
+ | 111111 | 112233 | 17 | aabbcc |
47
- | aa6 | 111116 | 112236 | 15 | 17fec027-e4ea-49bd-a325-94ecba5fd446 |
54
+ | 928845 | 817264 | 15 | abc456 |
55
+ | 200980 | 200121 | 15 | abc789 |
56
+ | 200980 | 200121 | 16 | abc789 |
57
+ | 548192 | 556119 | 15 | efg123 |
58
+ | 548192 | 556119 | 16 | efg123 |
59
+ | 548192 | 556119 | 17 | efg123 |
48
- | bb6 | 111116 | 112236 | 16 | 17fec027-e4ea-49bd-a325-94ecba5fd446 |
60
+ | 178260 | 178227 | 16 | efg456 |
61
+ | 178260 | 178227 | 17 | efg456 |
62
+ | 333704 | 333882 | 17 | efg789 |
49
63
 
50
- ### 追記
51
-
52
- > 記載いただいたコードを実行しますと、以下のエラーが出ます。
53
- > `TypeError: <lambda>() got an unexpected keyword argument 'include_groups'`
54
-
55
- > `include_groups` キーワードは `Pandas 2.2.0` で導入されましたので、おそらく、そちらでお使いのバージョンが `2.2.0` よりも前のものだと思われます。
56
-
57
- `Pandas 2.1.4` の場合では以下の様になります。
58
-
59
- ```python
60
- df = df.groupby(['居住地', '勤務地'], as_index=False)\
61
- .apply(lambda x: x.assign(uniqueid=uuid4()))\
62
- .reset_index(drop=True)
63
-
64
- print(df)
65
- ```
66
-

2

2024/07/02 13:07

投稿

melian
melian

スコア20283

test CHANGED
@@ -63,3 +63,4 @@
63
63
 
64
64
  print(df)
65
65
  ```
66
+

1

2024/07/02 13:03

投稿

melian
melian

スコア20283

test CHANGED
@@ -1,4 +1,4 @@
1
- 以下、`uniqueid` は `uuid.uuid4()` で生成しています。
1
+ 以下、`uniqueid` は `uuid.uuid4()` で生成しています。(Pandas のバージョンは `2.2.2`)
2
2
 
3
3
  ```python
4
4
  import pandas as pd
@@ -47,3 +47,19 @@
47
47
  | aa6 | 111116 | 112236 | 15 | 17fec027-e4ea-49bd-a325-94ecba5fd446 |
48
48
  | bb6 | 111116 | 112236 | 16 | 17fec027-e4ea-49bd-a325-94ecba5fd446 |
49
49
 
50
+ ### 追記
51
+
52
+ > 記載いただいたコードを実行しますと、以下のエラーが出ます。
53
+ > `TypeError: <lambda>() got an unexpected keyword argument 'include_groups'`
54
+
55
+ > `include_groups` キーワードは `Pandas 2.2.0` で導入されましたので、おそらく、そちらでお使いのバージョンが `2.2.0` よりも前のものだと思われます。
56
+
57
+ `Pandas 2.1.4` の場合では以下の様になります。
58
+
59
+ ```python
60
+ df = df.groupby(['居住地', '勤務地'], as_index=False)\
61
+ .apply(lambda x: x.assign(uniqueid=uuid4()))\
62
+ .reset_index(drop=True)
63
+
64
+ print(df)
65
+ ```