Guwaaago!

グワーゴ!岡山で働くIT系の人。このサイトにはWEB系の知識を記すこととす。

Pandasでmergeしたらデータが増えた:キーの重複

pandasでmergeする際、mergeしたDFのデータが増えるという現象が起こった。

import pandas as pd
df = pd.DataFrame({ 'A' : 1.,
                        'key' : pd.Categorical(["A","B","A","C","A"]),
                        'value' : 'foo' })
df2 = pd.DataFrame({ 'A2' : 1.,
                    'key' : pd.Categorical(["A","B","C","D"])})

display(df)
display(df2)

# A key value
# 0 1.0 A   foo
# 1 1.0 B   foo
# 2 1.0 A   foo
# 3 1.0 C   foo
# 4 1.0 A   foo

# A2    key
# 0 1.0 A
# 1 1.0 B
# 2 1.0 C
# 3 1.0 D

この2つのDFを右外部結合でマージする。

pd.merge(df, df2, on='key', how='right')


# A key value   A2
# 0 1.0 A   foo 1.0
# 1 1.0 A   foo 1.0
# 2 1.0 A   foo 1.0
# 3 1.0 B   foo 1.0
# 4 1.0 C   foo 1.0
# 5 NaN D   NaN 1.0

このように、df2に無かったデータが新たに作られてDFに入ってしまう。

感覚的にEXCELのvlookupのように使うものだと思っていたため、キーの重複について意識していなかったのが原因。 このケースだと、df内にAというキーが3つあるため、df2のAに対してすべてのパターンで結合するためデータが増えた(正しい挙動)。

pandas.pydata.org

解決法としては、重複を取り除く、howの指定を変えるなど、目的によって解決法が変わる。

pd.merge(df, df2, on='key')

# A key value   A2
# 0 1.0 A   foo 1.0
# 1 1.0 A   foo 1.0
# 2 1.0 A   foo 1.0
# 3 1.0 B   foo 1.0
# 4 1.0 C   foo 1.0

指定なし(inner)なら問題なし。

ちなみにキーが意図した通りにmergeされているかを判定する、validate引数もある。これは指定したmergeが行われていない場合はエラーを出して警告する。