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に対してすべてのパターンで結合するためデータが増えた(正しい挙動)。
解決法としては、重複を取り除く、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が行われていない場合はエラーを出して警告する。