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']]) #連結する軸を指定