【備忘録】pandas: 重複している値とそれに紐づく値を調べる


やりたいこと

IDとNAME列のテーブルがあります。
NAMEがいくつか重複していて、どのNAMEでどのIDが重複しているかを知りたいです。


>>> df = pandas.DataFrame({"ID":["a","b","c","d","e","f","g","h"], 
"NAME":["Alice","Bob","Chris","Chris","Chris","Dave","Eve","Eve"]})

>>> df
  ID   NAME
0  a  Alice
1  b    Bob
2  c  Chris
3  d  Chris
4  e  Chris
5  f   Dave
6  g    Eve
7  h    Eve

書いたコード

pandas.DataFrame.duplicated 関数で、重複しているデータを抽出します。

>>> df2 = df[df["NAME"].duplicated(keep=False)]

>>> df2
  ID   NAME
2  c  Chris
3  d  Chris
4  e  Chris
6  g    Eve
7  h    Eve

ChrisとEveが重複していることが分かりました。
ChrisとEveがどのIDなのかをより分かりやすくするため、IDを列方向に並べます。

まずは、DataFrameGroupBy.cumcount 関数で、NAMEごとに連番を振ります。

>>> df2["group_index"] = df2.groupby("NAME").cumcount()

>>> df2
  ID   NAME  group_index
2  c  Chris            0
3  d  Chris            1
4  e  Chris            2
6  g    Eve            0
7  h    Eve            1

そして、pandas.DataFrame.unstack 関数で、NAMEに対応するIDを列方向に並べました。

>>> df3 = df2.set_index(["NAME","group_index"])

>>> df3
                  ID
NAME  group_index   
Chris 0            c
      1            d
      2            e
Eve   0            g
      1            h

>>> df4 = df3.unstack()

>>> df4
            ID        
group_index  0  1    2
NAME                  
Chris        c  d    e
Eve          g  h  NaN