mergeメソッド
DataFrameの結合
今回の講義ではPandas の merge メソッドを使った
DataFrameの結合方法について学びます。
AさんからEさんまでの数学の点数が入ったデータと
AさんからEさんまでの国語の点数が入ったデータを
実際に作って結合します。
まずはPandasをimportして、数学の点数のはいった
DateFrameを作成します。
import pandas as pd
df01 = pd.DataFrame( {'氏名':['高橋','伊藤','鈴木','佐藤'],
'クラス':['a001','a001','a00','a001'],
'数学':[1, 2, 3, 4]})
df01
同様に今度は国語の点数の入ったデータを作成します。
df02 = pd.DataFrame( {'氏名':['高橋', '伊藤', '鈴木', '佐藤'],
'クラス':['a001', 'a001', 'a001', 'a001'],
'国語':[5, 6, 7, 8]})
df02
二つのデータフレームができたところで結合します。
重複するカラム名は氏名なので
onの引数に指名を指定して結合させます。
pd.merge(df01 ,df02, on='氏名')
氏名のキーは共通キーなので2つのカラムが1つになりました。
しかし、クラスのカラムはどちらのデータフレームにもあるカラムなので、
左のデータフレームのクラスには_xがつき、
右のデータフレームのクラスには_yがついています。
重複カラム名の変更
_xや_yという名前ではわかりにくい場合は、
任意の名前に変更することが可能です。。
suffixesという引数にリストでそれぞれの名前を渡します。
今回は左のデータフレームのカラムには_left
右のデータフレームには_rightという名前をつけます。
pd.merge(df01 ,df02, on='氏名', suffixes=['_left','_right'])
複数のキーで結合
df03 = pd.DataFrame( {'名前':['高橋','高橋'],
'クラス':['a001','a002'],
'英語':[15, 16]})
df03
次はカラム名、行数の異なる二つのデータの結合です。
上記で作成したdf03 と df01 の結合です。
df01 df03
カラム名がそれぞれ
氏名 クラス 数学
名前 クラス 英語
となっています。
この二つを結合します。
pd.merge(df01 ,df03, left_on=['氏名','クラス'],right_on=['名前','クラス'])
結合の種類 inner, left, right, outer
行数などがことなる二つのデータの結合方法です。
まず結合する二つのデータフレームを定義します。
df01 = pd.DataFrame( {'氏名':['高橋','伊藤','鈴木','佐藤'],
'クラス':['a001','a001','a001','a001'],
'数学':[1, 2, 3, 4]})
df01
df04 = pd.DataFrame( {'氏名':['高橋','伊藤','渡辺','加藤'],
'クラス':['a001','a001','a001','a001'],
'国語':[5, 6, 7, 8]})
df04
この二つのデータフレームの結合方法をそれぞれ見ていきます。
left
pd.merge(df01 ,df04, on='氏名', how='left')
左のデータを基準に右にデータがある場合、数値が示されます。
鈴木、佐藤の国語のデータはないのでNaNになっています。
right
pd.merge(df01 ,df04, on='氏名', how='right')
今度は右のデータを基準に結合されていますので、
渡辺、加藤の数学データはないのでNanになっています。
inner
pd.merge(df01 ,df04, on='氏名', how='inner')
二つのデータの共通項目のみでDataFrameが作成されます。
outer
pd.merge(df01 ,df04, on='氏名', how='outer')
全ての行が結合されます。データのない部分は全て
Nanとなっています。
これだけNanがあると、右のデータのNanなのか、左のデータの
Nanなのかわからなくなるので、そいった場合はindicator=Trueを
いれます。
pd.merge(df01 ,df04, on='氏名', how='outer' ,indicator=True)
インデックスを結合キーに使用する場合
まず、結合する二つのDataFrameを定義します。
df05 = pd.DataFrame( {'クラス':['df01','df01','df01','df01'],
'数学': [1, 2, 3, 4],
'国語':[5, 6, 7, 8]},
index=['高橋','伊藤','鈴木','佐藤'])
df02 = pd.DataFrame( {'氏名':['高橋','伊藤','鈴木','佐藤'],
'クラス':['a001','a001','a001','a001'],
'国語':[5, 6, 7, 8]})
df02
この二つのデータフレームを結合します。
df05はインデックスが名前のデータフレームです。
左のデータフレームの結合キーをindexにするには、
引数left_indexを使い、Trueを渡します。
pd.merge(df05 ,df02,left_index=True,right_on='氏名')
コメント