teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記

2020/06/26 04:07

投稿

kirara0048
kirara0048

スコア1399

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
+ ![ppshow](861c96e82fbb8bcbfc23610c5414e51b.png)