web-dev-qa-db-ja.com

pandasデータフレームで重複する行を見つける

pandasデータフレーム内の重複行を見つけようとしています。

df=pd.DataFrame(data=[[1,2],[3,4],[1,2],[1,4],[1,2]],columns=['col1','col2'])

df
Out[15]: 
   col1  col2
0     1     2
1     3     4
2     1     2
3     1     4
4     1     2

duplicate_bool = df.duplicated(subset=['col1','col2'], keep='first')
duplicate = df.loc[duplicate_bool == True]

duplicate
Out[16]: 
   col1  col2
2     1     2
4     1     2

最初の複製(保持されている複製)のインデックスを参照する列を追加する方法はありますか

duplicate
Out[16]: 
   col1  col2  index_original
2     1     2               0
4     1     2               0

注:私の場合、dfは非常に大きくなる可能性があります。

10
gabboshow

groupbyを使用し、インデックスの新しい列を作成してから、duplicatedを呼び出します。

df['index_original'] = df.groupby(['col1', 'col2']).col1.transform('idxmin')    
df[df.duplicated(subset=['col1','col2'], keep='first')]

   col1  col2  index_original
2     1     2               0
4     1     2               0

詳細

最初の2列をgroupbyし、次にtransform + idxminを呼び出して、各グループの最初のインデックスを取得します。

df.groupby(['col1', 'col2']).col1.transform('idxmin') 

0    0
1    1
2    0
3    3
4    0
Name: col1, dtype: int64

duplicatedは、保持したい値のブールマスクを提供します。

df.duplicated(subset=['col1','col2'], keep='first')

0    False
1    False
2     True
3    False
4     True
dtype: bool

残りはブールインデックスです。

10
cs95