質問のコードの最後の行にあるdata['判定'] = '重複'
という文は、「判定」列の全ての値を'重複'
にするという意味になります。「B列が全て'重複'と出力されてしま」うのはこのためです。
pandasでは、for文を使用しなくても手軽に操作できるように多くの便利なメソッドが実装されています。
pd.Series.duplicated()
を使うと、列内で重複している値にTrue
、ユニークな値にFalse
、が入った列が返ってきます。
pandas.Series.duplicated — pandas documentation
pandas.DataFrame, Seriesの重複した行を抽出・削除 | note.nkmk.me
これをインデックスにして'重複'
を挿入すれば希望の列が作成できます。
python
1In [11]: df = pd.DataFrame({'kigou': list('AABC')})
2
3In [12]: df.loc[df['kigou'].duplicated(False), 'B'] = '重複'
4
5In [13]: df
6Out[13]:
7 kigou B
80 A 重複
91 A 重複
102 B NaN
113 C NaN
速度テスト
python
1import pandas as pd
2import perfplot
3
4
5def duplicated(df):
6 is_duplicated = df['kigou'].duplicated(keep=False)
7 df.loc[is_duplicated, 'B'] = '重複'
8 return df
9
10
11# tiitoi氏の解答
12def groupby_tf(df):
13 is_unique = df.groupby('kigou')['kigou'].transform('count') > 1
14 df.loc[is_unique, 'B'] = '重複'
15 return df
16
17
18df = pd.DataFrame({'kigou': list('AAABBCDEFF')})
19ppdata = perfplot.bench(
20 setup=lambda n: pd.concat([df]*(n-1), ignore_index=True, axis=0),
21 n_range=[2 ** k for k in range(1, 22)],
22 kernels=[duplicated, groupby_tf],
23 labels=["duplicated", 'groupby_tf'],
24 xlabel="len")
25ppdata.show(time_unit="s")
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。