In [2]:
import pandas as pd
from pandas import Series, DataFrame
import numpy as np
In [3]:
# DataFrameを2つ用意します。
df_left = DataFrame({'key': ['X','Y','Z','X','Y'],
                  'data': range(5)})
df_right = DataFrame({'group_data': [10, 20]}, index=['X', 'Y'])
In [4]:
#Show
df_left
Out[4]:
data key
0 0 X
1 1 Y
2 2 Z
3 3 X
4 4 Y
In [5]:
#Show
df_right
Out[5]:
group_data
X 10
Y 20
In [6]:
# key列とindexを使ったマージができます。
pd.merge(df_left,df_right,left_on='key',right_index=True)
Out[6]:
data key group_data
0 0 X 10
3 3 X 10
1 1 Y 20
4 4 Y 20
In [7]:
# outerも使えます。
pd.merge(df_left,df_right,left_on='key',right_index=True,how='outer')
Out[7]:
data key group_data
0 0 X 10
3 3 X 10
1 1 Y 20
4 4 Y 20
2 2 Z NaN
In [8]:
# 階層的なindexの場合
df_left_hr = DataFrame({'key1': ['SF','SF','SF','LA','LA'],
                   'key2': [10, 20, 30, 20, 30],
                   'data_set': np.arange(5.)})
df_right_hr = DataFrame(np.arange(10).reshape((5, 2)),
                   index=[['LA','LA','SF','SF','SF'],
                          [20, 10, 10, 10, 20]],
                   columns=['col_1', 'col_2'])
In [9]:
df_left_hr
Out[9]:
data_set key1 key2
0 0 SF 10
1 1 SF 20
2 2 SF 30
3 3 LA 20
4 4 LA 30
In [10]:
# 階層的なindexの例
df_right_hr
Out[10]:
col_1 col_2
LA 20 0 1
10 2 3
SF 10 4 5
10 6 7
20 8 9
In [11]:
# leftは列名で、rightはindexでマージします。
pd.merge(df_left_hr,df_right_hr,left_on=['key1','key2'],right_index=True)
Out[11]:
data_set key1 key2 col_1 col_2
0 0 SF 10 4 5
0 0 SF 10 6 7
1 1 SF 20 8 9
3 3 LA 20 0 1
In [12]:
# outer
pd.merge(df_left_hr,df_right_hr,left_on=['key1','key2'],right_index=True,how='outer')
Out[12]:
data_set key1 key2 col_1 col_2
0 0 SF 10 4 5
0 0 SF 10 6 7
1 1 SF 20 8 9
2 2 SF 30 NaN NaN
3 3 LA 20 0 1
4 4 LA 30 NaN NaN
4 NaN LA 10 2 3
In [19]:
# joinというメソッドもあります
df_left.join(df_right)
Out[19]:
data key group_data
0 0 X NaN
1 1 Y NaN
2 2 Z NaN
3 3 X NaN
4 4 Y NaN