回答編集履歴
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 | 
            +
            
         | 
