nyの個人的Tipsまとめ

ITやデータサイエンスのことを中心にアウトプットのために更新していきます。

【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)

f:id:ny7777:20210829142125p:plain

上記のdf1, df2 の二つを"出席番号" をKEYとして結合します。

3.2 指定なし

pd.merge(df1, df2, on="出席番号")

f:id:ny7777:20210829143134p:plain

まずは、howによる指定なしで、結合を行ってみます。

これを見ると、両方のデータフレームに出席番号がある行だけが残っており、片方だけしか出席番号がない行は消えていることがわかります。

後述しますが、これは「how="inner"」と同じ挙動になります

3.3 how="left"

pd.merge(df1, df2, how='left', on='出席番号') 

f:id:ny7777:20210829143521p:plain

先ほどより、merge 後の行数が増えていることがわかります。

これは、df1 の出席番号と一致します。

つまり、「how="left"」は左側のデータフレーム (df1) のKEYを軸として、結合するのだといえます。

※この時の注意点として、本来データのないdf2の情報は"NaN"で穴埋めがされていることです。

この”NaN”の存在により、列の型が勝手に変わることもあります。今回においても、int型(整数)で入っていた”試験結果”の列は”NaN”が混じることにより、float型(小数)に変わっています。

こういった特徴も頭に入れておく必要があります。

3.4 how="right"

pd.merge(df1, df2, how='right', on='出席番号') 

f:id:ny7777:20210829144954p:plain 今度は先ほどと逆で、右側のデータフレーム(df2)のKEYを軸に結合が行われています。

3.5 how="inner"

pd.merge(df1, df2, how='inner', on='出席番号') 

f:id:ny7777:20210829144954p:plain how="inner"では、両方ともに含まれている”KEY”のみが残っています。

最初に表示した、"how"の指定なしの結合結果と同じになります。

この方法だと、結合による"NaN"の発生は防ぐことができますが、データの数が減ってしまうことに注意が必要です。

3.6 how="outer"

pd.merge(df1, df2, how='outer', on='出席番号') 

f:id:ny7777:20210829145458p:plain how="outer"にすれば、どちらか一方にでも存在するKEYは全て残っています。

つまり、一切のデータが失われることなく結合することができます。

ただし、NaNの割合が増え、扱いづらいデータになってしまう可能性もあります。

4. まとめ

今回は"how"の使い方にフォーカスを当てて、解説をしましたが、結合だけでもいろいろな方法と考えるべきことがあります。

これらを把握したうえで、pandasを使いこなし、Python上級者を目指しましょう!

今回は以上です。 今後、自分が困ったことや解決できたことなど、色々まとめていきたいと思っていますので、よろしくお願いします。