【Python】pandas使い方まとめ~mergeのhowを使いこなす~(横方向に結合する)
1. 目的
今回は、Pythonの必須ライブラリであるpandasの挙動について整理しています。
pandasを扱うときに、「indexやKEYを使って、横方向に結合したい!」ということがしばしばあると思いますが、
この時、気を付けるべきこととして、オプション”how”の使い方をまとめます。
2. pd.mergeの基本
機械学習で特徴量の準備をするときなどにおいて、複数のデータフレームを結合するという作業はよくあると思います。
その時、KEYを一致させる必要があるので、僕はこちらのコードを書いたりします。
pd.merge( データフレーム1, データフレーム2, on="KEY")
しかし、意識せずにこのコードを使うと、二つのデータフレームのKEYが一致しない時に意図しなかった挙動をすることがあります。
そこで、"how"を使いこなすことで、自分の意図した通りにデータを結合でき、これらの問題はあらかた解決するはずです!!
3. howのオプションについて
3.1 事前準備
今回はこちらの二つのデータフレームを実際にいろんな方法で結合することでその違いを観察します。
import pandas as pd import numpy as np df1 = pd.DataFrame( data={'出席番号': np.array([1, 2, 3, 4, 5]), '誕生月': np.array([11, 7, 2, 4, 6]), '性別': np.array(['男', '女', '女', '男', '女'])} ) df2 = pd.DataFrame( data={'出席番号': np.array([1, 2, 6]), '試験結果1': np.array([8, 7, 9]), '試験結果2': np.array([4 ,9 ,5])} ) display(df1) display(df2)
上記のdf1, df2 の二つを"出席番号" をKEYとして結合します。
3.2 指定なし
pd.merge(df1, df2, on="出席番号")
まずは、howによる指定なしで、結合を行ってみます。
これを見ると、両方のデータフレームに出席番号がある行だけが残っており、片方だけしか出席番号がない行は消えていることがわかります。
後述しますが、これは「how="inner"」と同じ挙動になります
3.3 how="left"
pd.merge(df1, df2, how='left', on='出席番号')
先ほどより、merge 後の行数が増えていることがわかります。
これは、df1 の出席番号と一致します。
つまり、「how="left"」は左側のデータフレーム (df1) のKEYを軸として、結合するのだといえます。
※この時の注意点として、本来データのないdf2の情報は"NaN"で穴埋めがされていることです。
この”NaN”の存在により、列の型が勝手に変わることもあります。今回においても、int型(整数)で入っていた”試験結果”の列は”NaN”が混じることにより、float型(小数)に変わっています。
こういった特徴も頭に入れておく必要があります。
3.4 how="right"
pd.merge(df1, df2, how='right', on='出席番号')
今度は先ほどと逆で、右側のデータフレーム(df2)のKEYを軸に結合が行われています。
3.5 how="inner"
pd.merge(df1, df2, how='inner', on='出席番号')
how="inner"では、両方ともに含まれている”KEY”のみが残っています。
最初に表示した、"how"の指定なしの結合結果と同じになります。
この方法だと、結合による"NaN"の発生は防ぐことができますが、データの数が減ってしまうことに注意が必要です。
3.6 how="outer"
pd.merge(df1, df2, how='outer', on='出席番号')
how="outer"にすれば、どちらか一方にでも存在するKEYは全て残っています。
つまり、一切のデータが失われることなく結合することができます。
ただし、NaNの割合が増え、扱いづらいデータになってしまう可能性もあります。
4. まとめ
今回は"how"の使い方にフォーカスを当てて、解説をしましたが、結合だけでもいろいろな方法と考えるべきことがあります。
これらを把握したうえで、pandasを使いこなし、Python上級者を目指しましょう!
今回は以上です。 今後、自分が困ったことや解決できたことなど、色々まとめていきたいと思っていますので、よろしくお願いします。