回答編集履歴

1

追記

2020/06/26 04:07

投稿

kirara0048
kirara0048

スコア1399

test CHANGED
@@ -1,3 +1,13 @@
1
+ 質問のコードの最後の行にある`data['判定'] = '重複'`という文は、「判定」列の全ての値を`'重複'`にするという意味になります。「B列が全て'重複'と出力されてしま」うのはこのためです。
2
+
3
+
4
+
5
+ ---
6
+
7
+
8
+
9
+ pandasでは、for文を使用しなくても手軽に操作できるように多くの便利なメソッドが実装されています。
10
+
1
11
  `pd.Series.duplicated()`を使うと、列内で重複している値に`True`、ユニークな値に`False`、が入った列が返ってきます。
2
12
 
3
13
  [pandas.Series.duplicated — pandas documentation](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.duplicated.html#pandas-series-duplicated)
@@ -35,3 +45,71 @@
35
45
  3 C NaN
36
46
 
37
47
  ```
48
+
49
+
50
+
51
+ ---
52
+
53
+
54
+
55
+ **速度テスト**
56
+
57
+
58
+
59
+ ```python
60
+
61
+ import pandas as pd
62
+
63
+ import perfplot
64
+
65
+
66
+
67
+
68
+
69
+ def duplicated(df):
70
+
71
+ is_duplicated = df['kigou'].duplicated(keep=False)
72
+
73
+ df.loc[is_duplicated, 'B'] = '重複'
74
+
75
+ return df
76
+
77
+
78
+
79
+
80
+
81
+ # tiitoi氏の解答
82
+
83
+ def groupby_tf(df):
84
+
85
+ is_unique = df.groupby('kigou')['kigou'].transform('count') > 1
86
+
87
+ df.loc[is_unique, 'B'] = '重複'
88
+
89
+ return df
90
+
91
+
92
+
93
+
94
+
95
+ df = pd.DataFrame({'kigou': list('AAABBCDEFF')})
96
+
97
+ ppdata = perfplot.bench(
98
+
99
+ setup=lambda n: pd.concat([df]*(n-1), ignore_index=True, axis=0),
100
+
101
+ n_range=[2 ** k for k in range(1, 22)],
102
+
103
+ kernels=[duplicated, groupby_tf],
104
+
105
+ labels=["duplicated", 'groupby_tf'],
106
+
107
+ xlabel="len")
108
+
109
+ ppdata.show(time_unit="s")
110
+
111
+ ```
112
+
113
+
114
+
115
+ ![ppshow](861c96e82fbb8bcbfc23610c5414e51b.png)