PandasでMergeする時の基礎的な振る舞い

merge関数(結合)
df1

df1 = pd.DataFrame({'key':['b','b','a','c','a','a','b'], 'data1':range(7)})
In [18]: df1
Out[18]: 
   data1 key
0      0   b
1      1   b
2      2   a
3      3   c
4      4   a
5      5   a
6      6   b

df2

df2 = pd.DataFrame({'key': ['a', 'b', 'd'], 'data2' : range(3)})
In [17]: df2
Out[17]: 
   data2 key
0      0   a
1      1   b
2      2   d

#merge関数:普通にやるとInner joinで(デカルト積)

In [31]: pd.merge(df1, df3)
Out[31]: 
   data1 key  data2
0      0   b      1
1      1   b      1
2      6   b      1
3      2   a      0
4      2   a      2
5      4   a      0
6      4   a      2
7      5   a      0
8      5   a      2

Left / right / outerに結合する。(デカルト積)

In [34]: pd.merge(df1, df3, how='outer')
Out[34]: 
    data1 key  data2
0       0   b      1
1       1   b      1
2       6   b      1
3       2   a      0
4       2   a      2
5       4   a      0
6       4   a      2
7       5   a      0
8       5   a      2
9       3   c    NaN  # Rightにするとここが表示されない
10    NaN   d      3 # Leftにするとここが表示されない

結合するKeyを指定する。

pd.merge(df1,df3, left_on='key', right_on='key')

Indexで結合する

In [36]: pd.merge(df1, df3, right_index=True, left_index=True, how='outer')
Out[36]: 
   data1 key_x  data2 key_y
0      0     b      0     a
1      1     b      1     b
2      2     a      2     a
3      3     c      3     d
4      4     a    NaN   NaN
5      5     a    NaN   NaN
6      6     b    NaN   NaN

Concat関数(連結)

Seriesの作成

s1 = pd.Series([0,1], index = ['a','b']
s2 = pd.Series([2,3,4], index = ['c','d','e'])
s3 = pd.Series([5,6], index = ['f', 'g'])

DataFrameとして結合(axis=0でSeriesのまま結合)

 pd.concat([s3,s1,s2], axis=1)
    0   1   2
a NaN   0 NaN
b NaN   1 NaN
c NaN NaN   2
d NaN NaN   3
e NaN NaN   4
f   5 NaN NaN
g   6 NaN NaN

 pd.concat([s3,s1,s2], axis=1, join='inner') #inner join (defaultはouterjoin)
 pd.concat([s3,s1,s2], axis=1, join_axes=[['a','c']]) #連結する軸を指定