回答編集履歴
5
test
CHANGED
@@ -24,13 +24,11 @@
|
|
24
24
|
df = pd.read_csv(io.StringIO(csv_data))
|
25
25
|
|
26
26
|
#
|
27
|
-
uid =
|
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
|
31
|
+
df = df.set_index('uniqueid').loc[df['uniqueid'].unique()].reset_index()[[*cols, 'uniqueid']]
|
34
32
|
|
35
33
|
print(df)
|
36
34
|
```
|
4
uuid4() 版に書き換え
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 = [
|
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
|
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
|
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
test
CHANGED
@@ -1,66 +1,63 @@
|
|
1
|
+
> 【実現したいこと】の別の言い方になります。
|
2
|
+
> 以下の【df】のデータを上からなめていき、
|
1
|
-
|
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
|
-
|
15
|
+
居住地,勤務地,day
|
10
|
-
|
16
|
+
111111,112233,15
|
11
|
-
|
17
|
+
111111,112233,15
|
12
|
-
aa3,111113,112232,15
|
13
|
-
|
18
|
+
928845,817264,15
|
19
|
+
200980,200121,15
|
14
|
-
|
20
|
+
548192,556119,15
|
15
|
-
aa6,111116,112236,15
|
16
|
-
|
21
|
+
111111,112233,16
|
17
|
-
|
22
|
+
111111,112233,16
|
18
|
-
|
23
|
+
178260,178227,16
|
24
|
+
200980,200121,16
|
19
|
-
|
25
|
+
548192,556119,16
|
20
|
-
|
26
|
+
111111,112233,17
|
21
|
-
|
27
|
+
111111,112233,17
|
22
|
-
|
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
|
-
|
38
|
+
cum_cols = ['居住地', '勤務地', 'cumcount']
|
28
|
-
|
39
|
+
df['cumcount'] = df.groupby(cols).cumcount()
|
40
|
+
df['uniqueid'] = df.groupby(cum_cols, sort=False)['cumcount'].transform(lambda _: next(uid_iter))
|
29
|
-
|
41
|
+
df = df.set_index('uniqueid').loc[uid].reset_index()[cols + ['uniqueid']]
|
30
42
|
|
31
43
|
print(df)
|
32
44
|
```
|
33
45
|
|
34
|
-
|
|
46
|
+
| 居住地 | 勤務地 | day | uniqueid |
|
35
|
-
|
|
47
|
+
|---------:|---------:|------:|:-----------|
|
36
|
-
|
|
48
|
+
| 111111 | 112233 | 15 | abc123 |
|
37
|
-
|
|
49
|
+
| 111111 | 112233 | 16 | abc123 |
|
38
|
-
|
|
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
|
-
|
|
51
|
+
| 111111 | 112233 | 15 | aabbcc |
|
45
|
-
|
|
52
|
+
| 111111 | 112233 | 16 | aabbcc |
|
46
|
-
|
|
53
|
+
| 111111 | 112233 | 17 | aabbcc |
|
47
|
-
|
|
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
|
-
|
|
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
test
CHANGED
@@ -63,3 +63,4 @@
|
|
63
63
|
|
64
64
|
print(df)
|
65
65
|
```
|
66
|
+
|
1
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
|
+
```
|