In [13]:
import numpy as np
import pandas as pd
from pandas import  DataFrame
In [3]:
#  サンプルになるDataFrameを作ります。
dframe1 = DataFrame({'key':['X','Z','Y','Z','X','X'],'data_set_1': np.arange(6)})
dframe1
Out[3]:
data_set_1 key
0 0 X
1 1 Z
2 2 Y
3 3 Z
4 4 X
5 5 X
In [4]:
# もう一つ別のDataFrameを作ります。
dframe2 = DataFrame({'key':['Q','Y','Z'],'data_set_2':[1,2,3]})
dframe2
Out[4]:
data_set_2 key
0 1 Q
1 2 Y
2 3 Z
In [5]:
#mergeメソッドを使います。これは、多対一
pd.merge(dframe1,dframe2)
Out[5]:
data_set_1 key data_set_2
0 1 Z 3
1 3 Z 3
2 2 Y 2
In [6]:
# 列名を指定できます。
pd.merge(dframe1,dframe2,on='key')
Out[6]:
data_set_1 key data_set_2
0 1 Z 3
1 3 Z 3
2 2 Y 2
In [7]:
# 列名を指定して、どのようにマージするかも選べます。
pd.merge(dframe1,dframe2,on='key',how='left')
Out[7]:
data_set_1 key data_set_2
0 0 X NaN
1 1 Z 3
2 2 Y 2
3 3 Z 3
4 4 X NaN
5 5 X NaN
In [8]:
# howの引数を変えてみましょう。
pd.merge(dframe1,dframe2,on='key',how='right')
Out[8]:
data_set_1 key data_set_2
0 1 Z 3
1 3 Z 3
2 2 Y 2
3 NaN Q 1
In [9]:
# keyに関して両方のDataFrameのデータを使いたい場合
pd.merge(dframe1,dframe2,on='key',how='outer')
Out[9]:
data_set_1 key data_set_2
0 0 X NaN
1 4 X NaN
2 5 X NaN
3 1 Z 3
4 3 Z 3
5 2 Y 2
6 NaN Q 1
In [10]:
# 今度は多対多
# 両方のDataFrameで、keyに関して複数の行がある。
dframe3 = DataFrame({'key': ['X', 'X', 'X', 'Y', 'Z', 'Z'],
                 'data_set_3': range(6)})
dframe4 = DataFrame({'key': ['Y', 'Y', 'X', 'X', 'Z'],
                 'data_set_4': range(5)})
#Show the merge
pd.merge(dframe3, dframe4)
Out[10]:
data_set_3 key data_set_4
0 0 X 2
1 0 X 3
2 1 X 2
3 1 X 3
4 2 X 2
5 2 X 3
6 3 Y 0
7 3 Y 1
8 4 Z 4
9 5 Z 4
In [11]:
# 複数の列名に関して、mergeを使うこともできます。
df_left = DataFrame({'key1': ['SF', 'SF', 'LA'],
                  'key2': ['one', 'two', 'one'],
                  'left_data': [10,20,30]})
df_right = DataFrame({'key1': ['SF', 'SF', 'LA', 'LA'],
                   'key2': ['one', 'one', 'one', 'two'],
                   'right_data': [40,50,60,70]})
pd.merge(df_left, df_right, on=['key1', 'key2'], how='outer')
Out[11]:
key1 key2 left_data right_data
0 SF one 10 40
1 SF one 10 50
2 SF two 20 NaN
3 LA one 30 60
4 LA two NaN 70
In [35]:
# 列名が重複している場合は、自動的にsuffix(接尾辞)を付けてくる
pd.merge(df_left,df_right,on='key1')
Out[35]:
key1 key2_x left_data key2_y right_data
0 SF one 10 one 40
1 SF one 10 one 50
2 SF two 20 one 40
3 SF two 20 one 50
4 LA one 30 one 60
5 LA one 30 two 70
In [12]:
# 追加する文字列を指定することも可能です。
pd.merge(df_left,df_right, on='key1',suffixes=('_lefty','_righty'))
Out[12]:
key1 key2_lefty left_data key2_righty right_data
0 SF one 10 one 40
1 SF one 10 one 50
2 SF two 20 one 40
3 SF two 20 one 50
4 LA one 30 one 60
5 LA one 30 two 70
In [37]:
# 公式ドキュメントはこちら
url = 'http://pandas.pydata.org/pandas-docs/dev/generated/pandas.DataFrame.merge.html'