gijyutsu-keisan.com

3.6.3.DataFrameの結合

サンプルデータフレームとして次のものを用います。
>>> A = pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]],index=['a','b','c'],columns=['x','y','z'])
>>> A
x  y  z
a  1  2  3
b  4  5  6
c  7  8  9

>>> B = pd.DataFrame([[1,3,5],[7,9,11],[13,15,17]],index=['b','c','d'],columns=['u','v','w'])
u   v   w
b   1   3   5
c   7   9  11
d  13  15  17

>>> C = pd.DataFrame([[1,3,5],[2,8,14],[13,15,17]],index=['b','c','d'],columns=['u','y','w'])
>>> C
u   y   w
b   1   3   5
c   2   8  14
d  13  15  17

  1. mergeを使った結合
  2. joinを使った結合

(1)mergeを使った結合

  • pandas.merge(DataFrame1, DataFrame2, how, on, left_on, right_on)
    または
  • A.merge(DataFrame, how, on, left_on, right_on)
DataFrame 結合するデータフレームを指定します。
how 結合方法を次の中から選択します。
left / right / inner / outer
未指定の場合は“inner”が適用されます。 それぞれについては下記のサンプルを参照ください。
on 2つのデータフレーム内から、指定した列名を探し出し、その中で共通する要素の行を抽出します。
left_on
right_on

データフレームだけを指定する場合は次のようになります。
#A、Bに共通する列が1列の場合 *********************
>>> A = pd.DataFrame({'x':['a','b','c'],'y':[1,4,7],'z':[2,5,9]})
>>> A
x  y  z
0  a  1  2
1  b  4  5
2  c  7  9

>>> B = pd.DataFrame({'x':['a','b','c'],'u':[1,2,3],'v':[4,5,6]})
>>> B
u  v  x
0  1  4  a
1  2  5  b
2  3  6  c

>>> pd.merge(A,B)	# A.merge(B)でも同じ結果になります。
x  y  z  u  v
0  a  1  2  1  4
1  b  4  5  2  5
2  c  7  9  3  6

#A、Bに共通する列が2列の場合 *********************
>>> A = pd.DataFrame({'x':['a','b','c'],'y':[1,4,7],'z':[2,5,9]})
>>> A
x  y  z
0  a  1  2
1  b  4  5
2  c  7  9

>>> B = pd.DataFrame({'x':['a','b','c'],'y':[1,2,3],'v':[4,5,6]})
>>> B
v  x  y
0  4  a  1
1  5  b  2
2  6  c  3

>>> pd.merge(A,B)	# A.merge(B)でも同じ結果になります。
x  y  z  v
0  a  1  2  4	#A,Bを結合する際、共通する2列のうち同じ要素を含む行を出力します。

“pd.merge(A,B,on)”で指定する場合、次のようになります。
>>> A
x  y  z
0  a  1  2
1  b  4  5
2  c  7  9

>>> B
v  x  y
0  4  a  1
1  5  b  2
2  6  c  3

>>> pd.merge(A,B,on='x')	# A.merge(B,on='x')でも同じ結果になります。
x  y_x  z  v  y_y
0  a    1  2  4    1
1  b    4  5  5    2
2  c    7  9  6    3

>>> A = pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]],index=['a','b','c'],columns=['x','y','z'])
>>> A
x  y  z
a  1  2  3
b  4  5  6
c  7  8  9

>>> B = pd.DataFrame([[1,3,5],[2,8,14],[13,15,17]],index=['b','c','d'],columns=['u','y','w'])
>>> B
u   y   w
b   1   3   5
c   2   8  14
d  13  15  17

#AとCに共通な'y'列のうち、AとCの共通要素を含む行を抽出します。
>>> pd.merge(A,C)	#A.merge(C)でも結果は同じです。
x  y  z  u   w
0  7  8  9  2  14

“A.merge(DataFrame,on)”で指定する場合、次のようになります。
#AとCに共通な'y'列のうち、AとCの共通要素を含む行を抽出します。
>>> A.merge(C,on='y')
x  y  z  u   w
0  7  8  9  2  14

“A.merge(DataFrame,left_on,right_on)”で指定する場合、次のようになります。
#Aの'x'列とBの'u'列を比較して、共通要素のある行を抽出します。
>>> A.merge(B,left_on='x',right_on='u')
x  y  z  u  v   w
0  1  2  3  1  3   5
1  7  8  9  7  9  11

#Aの'z'列とBの'v'列を比較して、共通要素のある行を抽出します。
>>> A.merge(B,left_on='z',right_on='v')
x  y  z  u  v   w
0  1  2  3  1  3   5
1  7  8  9  7  9  11

#Aの'z'列とBの'w'列を比較したが、共通要素がない場合になります。
>>> A.merge(B,left_on='z',right_on='w')
Empty DataFrame
Columns: [x, y, z, u, v, w]
Index: []

節はじめに戻る


(2)joinを使った結合

  • A.join(DataFrame, how)
DataFrame 結合するデータフレームを指定します。
how 結合方法を次の中から選択します。
left / right / inner / outer
未指定の場合は“left”が適用されます。 それぞれについては下記のサンプルを参照ください。

データフレームの指定のみで“join”を実行します。
>>> A.join(B)
x  y  z    u    v     w
a  1  2  3  NaN  NaN   NaN
b  4  5  6  1.0  3.0   5.0
c  7  8  9  7.0  9.0  11.0

“how”を指定した場合は次のようになります。
#how=leftのとき **********************************
#Aのindex(行)ラベルと一致するBの行を結合します。
#BにAのindexラベルと一致しない行がある場合は'NaN'が入ります。
#(今回の例ではBの'd'行は結合されません)
>>> A.join(B,how='left')	# → A.join(B)と同じ結果になります
x  y  z    u    v     w
a  1  2  3  NaN  NaN   NaN
b  4  5  6  1.0  3.0   5.0
c  7  8  9  7.0  9.0  11.0

#how=rightのとき *********************************
#Bのindex(行)ラベルと一致するAの行を結合します。
#AにBのindexラベルと一致しない行がある場合は'NaN'が入ります。
#(今回の例ではAの'a'行は結合されません)
>>> A.join(B,how='right')
x    y    z   u   v   w
b  4.0  5.0  6.0   1   3   5
c  7.0  8.0  9.0   7   9  11
d  NaN  NaN  NaN  13  15  17

#how=innerのとき *********************************
#AとBのindex(行)ラベルが一致するものどうしを結合します。
#(今回の例では'a'、'd'行が結合されません)
>>> A.join(B,how='inner')
x  y  z  u  v   w
b  4  5  6  1  3   5
c  7  8  9  7  9  11

#how=outerのとき *********************************
#AとBすべてのindex(行)分を結合します。
#A,Bそれぞれに一致しない行がある場合は'NaN'が入ります。
>>> A.join(B,how='outer')
x    y    z     u     v     w
a  1.0  2.0  3.0   NaN   NaN   NaN
b  4.0  5.0  6.0   1.0   3.0   5.0
c  7.0  8.0  9.0   7.0   9.0  11.0
d  NaN  NaN  NaN  13.0  15.0  17.0

節はじめに戻る

参考文献

関連ページ