Python 無料で独習 データフレームの結合方法(merge) Pandas入門11

Python
この記事は約6分で読めます。

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='氏名')

  

コメント

タイトルとURLをコピーしました