1.合并數(shù)據(jù)集
DataFrame 中的merge方法是一種多對一的合并。
df1 = DataFrame({'key':['b','b','a','c','a','a','b'],
'data1':range(7)})
df2 = DataFrame({'key':['a','b','d'],
'data2':range(3)})
print pd.merge(df1,df2)
df1中的數(shù)據(jù)有多個被標記為a和b的行,而df2中key列的每個值則僅對應(yīng)一行。對這些對象調(diào)用merge即可得到:
data1 key data2
0 0 b 1
1 1 b 1
2 6 b 1
3 2 a 0
4 4 a 0
5 5 a 0
我們并沒有指明要用那個列進行連接,如果沒有指定,merge就會將重疊列的列名當(dāng)做鍵。但是我們最好顯示指定一下
pd.merge(df1,df2,on='key')
如果兩個對象的列名不同,也可以分別進行指定:
df3 = DataFrame({'lkey':['b','b','a','c','a','a','b'],
'data1':range(7)})
df4 = DataFrame({'rkey':['a','b','d'],
'data2':range(3)})
print pd.merge(df3,df4,left_on='lkey',right_on='rkey')
'''
data1 lkey data2 rkey
0 0 b 1 b
1 1 b 1 b
2 6 b 1 b
3 2 a 0 a
4 4 a 0 a
5 5 a 0 a
'''
可以看得出來原本兩個數(shù)據(jù)集中的某些數(shù)據(jù)消失了,這是因為merge做的是'inner'連接;結(jié)果中的鍵是交集。其他方式還有l(wèi)eft、right以及outer。外鏈接求取的是鍵的并集,組合了左連接和右連接的效果:
pd.merge(df1,df2,how='outer')
'''
輸出結(jié)果為:
data1 key data2
0 0.0 b 1.0
1 1.0 b 1.0
2 6.0 b 1.0
3 2.0 a 0.0
4 4.0 a 0.0
5 5.0 a 0.0
6 3.0 c NaN
7 NaN d 2.0
'''
當(dāng)使用merge方法傳入的兩個數(shù)據(jù)集為多對多關(guān)系的時候返回的結(jié)果將會是笛卡爾積
df1 = DataFrame({'key':['b','b','a','c','a','b'],
'data1':range(6)})
df2 = DataFrame({'key':['a','b','a','b','d'],
'data2':range(5)})
print pd.merge(df1,df2,on='key' ,how='left')
'''
返回結(jié)果為:
data1 key data2
0 0 b 1.0
1 0 b 3.0
2 1 b 1.0
3 1 b 3.0
4 2 a 0.0
5 2 a 2.0
6 3 c NaN
7 4 a 0.0
8 4 a 2.0
9 5 b 1.0
10 5 b 3.0
'''
merge也可以傳入一個由列名組成的列表:
left = DataFrame({'key1':['foo','foo','bar'],
'key2':['one','two','one'],
'lval':[1,2,3]})
right = DataFrame({'key1':['foo','foo','bar','bar'],
'key2':['one','one','one','two'],
'rval':[4,5,6,7]})
print pd.merge(left,right,on=['key1','key2'], how='outer')
'''
輸出結(jié)果為:
key1 key2 lval rval
0 foo one 1.0 4.0
1 foo one 1.0 5.0
2 foo two 2.0 NaN
3 bar one 3.0 6.0
4 bar two NaN 7.0
'''
使用merge去合并兩個DataFrame時可能出現(xiàn)一種情況——合并完以后還會出現(xiàn)兩列列名一樣的列(左右各一列),這個時候suffixes參數(shù)可以解決這個問題
left = DataFrame({'key1':['foo','foo','bar'],
'key2':['one','two','one'],
'lval':[1,2,3]})
right = DataFrame({'key1':['foo','foo','bar','bar'],
'key2':['one','one','one','two'],
'rval':[4,5,6,7]})
print pd.merge(left,right,on='key1',suffixes=('_left','_right'))
'''
輸出結(jié)果為:
key1 key2_left lval key2_right rval
0 foo one 1 one 4
1 foo one 1 one 5
2 foo two 2 one 4
3 foo two 2 one 5
4 bar one 3 one 6
5 bar one 3 two 7
'''
索引上的合并
有的時候DataFrame中的連接鍵位于其索引中。這個時候我們可以傳入left_index=True或right_index=True已說明索引應(yīng)該被用作連接鍵:
left1 = DataFrame({'key':['a','b','a','a','b','c'],
'value':range(6)})
right1 = DataFrame({'group_val':[3.5,7]},index=['a','b'])
print pd.merge(left1,right1,left_on='key',right_index=True)
'''
輸出結(jié)果為:
key value group_val
0 a 0 3.5
2 a 2 3.5
3 a 3 3.5
1 b 1 7.0
4 b 4 7.0
'''
但是這種方法用起來往往有些麻煩,所以我們更常用的是join方法