數(shù)據(jù)規(guī)整化

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方法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容