回答編集履歴
1
追記
answer
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
質問のコードの最後の行にある`data['判定'] = '重複'`という文は、「判定」列の全ての値を`'重複'`にするという意味になります。「B列が全て'重複'と出力されてしま」うのはこのためです。
|
2
|
+
|
3
|
+
---
|
4
|
+
|
5
|
+
pandasでは、for文を使用しなくても手軽に操作できるように多くの便利なメソッドが実装されています。
|
1
6
|
`pd.Series.duplicated()`を使うと、列内で重複している値に`True`、ユニークな値に`False`、が入った列が返ってきます。
|
2
7
|
[pandas.Series.duplicated — pandas documentation](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.duplicated.html#pandas-series-duplicated)
|
3
8
|
[pandas.DataFrame, Seriesの重複した行を抽出・削除 | note.nkmk.me](https://note.nkmk.me/python-pandas-duplicated-drop-duplicates/)
|
@@ -16,4 +21,38 @@
|
|
16
21
|
1 A 重複
|
17
22
|
2 B NaN
|
18
23
|
3 C NaN
|
19
|
-
```
|
24
|
+
```
|
25
|
+
|
26
|
+
---
|
27
|
+
|
28
|
+
**速度テスト**
|
29
|
+
|
30
|
+
```python
|
31
|
+
import pandas as pd
|
32
|
+
import perfplot
|
33
|
+
|
34
|
+
|
35
|
+
def duplicated(df):
|
36
|
+
is_duplicated = df['kigou'].duplicated(keep=False)
|
37
|
+
df.loc[is_duplicated, 'B'] = '重複'
|
38
|
+
return df
|
39
|
+
|
40
|
+
|
41
|
+
# tiitoi氏の解答
|
42
|
+
def groupby_tf(df):
|
43
|
+
is_unique = df.groupby('kigou')['kigou'].transform('count') > 1
|
44
|
+
df.loc[is_unique, 'B'] = '重複'
|
45
|
+
return df
|
46
|
+
|
47
|
+
|
48
|
+
df = pd.DataFrame({'kigou': list('AAABBCDEFF')})
|
49
|
+
ppdata = perfplot.bench(
|
50
|
+
setup=lambda n: pd.concat([df]*(n-1), ignore_index=True, axis=0),
|
51
|
+
n_range=[2 ** k for k in range(1, 22)],
|
52
|
+
kernels=[duplicated, groupby_tf],
|
53
|
+
labels=["duplicated", 'groupby_tf'],
|
54
|
+
xlabel="len")
|
55
|
+
ppdata.show(time_unit="s")
|
56
|
+
```
|
57
|
+
|
58
|
+

|