Pandas操作數(shù)據(jù)集非常的方便,其中體現(xiàn)在就是有些在SQL語句中常用的方法,比如在合并數(shù)據(jù)集、left join、right join、full join、inner join,在Pandas中都可以使用concat和merge簡(jiǎn)單的實(shí)現(xiàn)
concat參數(shù)
pd.concat(objs, axis=0, join='outer', join_axes=None,
ignore_index=False,keys=None,levels=None,
names=None,verify_integrity=False,
copy=True)
1、objs : #輸入,DataFrame格式或list(多個(gè)合并).
2、axis: {0, 1, ...}, default 0. #控制連接的方向,0代表列縱向,1代表行橫向
3、join : {‘inner’, ‘outer’}, default ‘outer’. #控制連接的索引,inner表示取表索引之間的交集,outer表示取索引的并集
4、ignore_index: boolean, default False. #是否使用原索引,選舍棄便對(duì)新表重新進(jìn)行索引排序。
5、join_axes : list of Index objects. #設(shè)定使用的索引,例以df1的索引為標(biāo)準(zhǔn),join_axes=[df1.index]
6、keys : sequence, default None. #類似Multiindex,設(shè)立另一層索引
merge的參數(shù)
merge(left, right, how='inner', on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=True,
suffixes=('_x', '_y'), copy=True, indicator=False)
1、on:列名,join用來對(duì)齊的那一列的名字,用到這個(gè)參數(shù)的時(shí)候一定要保證左表和右表用來對(duì)齊的那一列都有相同的列名。
2、left_on:左表對(duì)齊的列,可以是列名,也可以是和dataframe同樣長(zhǎng)度的arrays。
3、right_on:右表對(duì)齊的列,可以是列名,也可以是和dataframe同樣長(zhǎng)度的arrays。
4、left_index/ right_index: 如果是True的haunted以index作為對(duì)齊的key
5、how:數(shù)據(jù)融合的方法。
6、sort:根據(jù)dataframe合并的keys按字典順序排序,默認(rèn)是,如果置false可以提高表現(xiàn)。
1. 縱向合并數(shù)據(jù)集
縱向合并數(shù)據(jù)的方法concat和append,類似SQL中的union
#樣集1
In [9]:df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']},
index=[0, 1, 2, 3])
In [9]:df1
Out[9]:
A B C D
0 A0 B0 C0 D0
1 A1 B1 C1 D1
2 A2 B2 C2 D2
3 A3 B3 C3 D3
# 樣集2
In [10]:df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
'B': ['B4', 'B5', 'B6', 'B7'],
'C': ['C4', 'C5', 'C6', 'C7'],
'D': ['D4', 'D5', 'D6', 'D7']},
index=[4, 5, 6, 7])
In [10]:df2
Out[10]:
A B C D
4 A4 B4 C4 D4
5 A5 B5 C5 D5
6 A6 B6 C6 D6
7 A7 B7 C7 D7
#樣集3
In [11]:df3 = pd.DataFrame({'A': ['A8', 'A9', 'A10', 'A11'],
'B': ['B8', 'B9', 'B10', 'B11'],
'C': ['C8', 'C9', 'C10', 'C11'],
'D': ['D8', 'D9', 'D10', 'D11']},
index=[8, 9, 10, 11])
In [11]:df3
Out[11]:
A B C D
8 A8 B8 C8 D8
9 A9 B9 C9 D9
10 A10 B10 C10 D10
11 A11 B11 C11 D11
#樣集4
In [12]:df4 = pd.DataFrame({'B': ['B2', 'B3', 'B6', 'B7'],
'D': ['D2', 'D3', 'D6', 'D7'],
'F': ['F2', 'F3', 'F6', 'F7']},
index=[2, 3, 6, 7])
In [12]:df4
Out[12]:
B D F
2 B2 D2 F2
3 B3 D3 F3
6 B6 D6 F6
7 B7 D7 F7
1.1 使用concat
concat的語法形式
pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,
keys=None, levels=None, names=None, verify_integrity=False)
#縱向合并df1、df2、df3
In [13]:frames = [df1, df2, df3]
In [14]:pd.concat(frames)
Out[14]:
A B C D
0 A0 B0 C0 D0
1 A1 B1 C1 D1
2 A2 B2 C2 D2
3 A3 B3 C3 D3
4 A4 B4 C4 D4
5 A5 B5 C5 D5
6 A6 B6 C6 D6
7 A7 B7 C7 D7
8 A8 B8 C8 D8
9 A9 B9 C9 D9
10 A10 B10 C10 D10
11 A11 B11 C11 D11
#使用key為每個(gè)數(shù)據(jù)集指定塊標(biāo)記
In [15]: pd.concat(frames,keys=['x','y','z'])
Out[15]:
A B C D
x 0 A0 B0 C0 D0
1 A1 B1 C1 D1
2 A2 B2 C2 D2
3 A3 B3 C3 D3
y 4 A4 B4 C4 D4
5 A5 B5 C5 D5
6 A6 B6 C6 D6
7 A7 B7 C7 D7
z 8 A8 B8 C8 D8
9 A9 B9 C9 D9
10 A10 B10 C10 D10
11 A11 B11 C11 D11
#使用塊標(biāo)記提取數(shù)據(jù)子集
In [16]:result.ix['y']
Out[16]:
A B C D
4 A4 B4 C4 D4
5 A5 B5 C5 D5
6 A6 B6 C6 D6
7 A7 B7 C7 D7
#concat默認(rèn)join='outer',所以縱向合并,沒有值補(bǔ)缺失值,索引可以為重復(fù)
In [17]:result = pd.concat([df1,df4])
In [18]:result
Out[18]:
A B C D F
0 A0 B0 C0 D0 NaN
1 A1 B1 C1 D1 NaN
2 A2 B2 C2 D2 NaN
3 A3 B3 C3 D3 NaN
2 NaN B2 NaN D2 F2
3 NaN B3 NaN D3 F3
6 NaN B6 NaN D6 F6
7 NaN B7 NaN D7 F7
#concat默認(rèn)join='outer',把重復(fù)的索引合并,索引沒有重復(fù)
In [19]:result = pd.concat([df1,df4],axis=1)
In [20]:result
Out[20]:
A B C D B D F
0 A0 B0 C0 D0 NaN NaN NaN
1 A1 B1 C1 D1 NaN NaN NaN
2 A2 B2 C2 D2 B2 D2 F2
3 A3 B3 C3 D3 B3 D3 F3
6 NaN NaN NaN NaN B6 D6 F6
7 NaN NaN NaN NaN B7 D7 F7
#concat修改join='inner',只保留重復(fù)的索引合并
In [21]:result = pd.concat([df1,df4],axis=1,join='inner')
In [22]:result
Out[22]:
A B C D B D F
2 A2 B2 C2 D2 B2 D2 F2
3 A3 B3 C3 D3 B3 D3 F3
#concat按照其中一個(gè)索引合并,只保留重復(fù)的索引合并
In [23]:result = pd.concat([df1,df4],axis=1,join_axes=[df1.index])
In [24]:result
Out[24]:
A B C D B D F
0 A0 B0 C0 D0 NaN NaN NaN
1 A1 B1 C1 D1 NaN NaN NaN
2 A2 B2 C2 D2 B2 D2 F2
3 A3 B3 C3 D3 B3 D3 F3
1.2 使用append
#等價(jià)于result = pd.concat([df1,df2])
In [25]:result = df1.append(df2)
In [26]:result
Out[26]:
A B C D
0 A0 B0 C0 D0
1 A1 B1 C1 D1
2 A2 B2 C2 D2
3 A3 B3 C3 D3
4 A4 B4 C4 D4
5 A5 B5 C5 D5
6 A6 B6 C6 D6
7 A7 B7 C7 D7
#等價(jià)于result = pd.concat([df1,df4])
In [27]:result = df1.append(df4)
In [28]:result
Out[28]:
A B C D F
0 A0 B0 C0 D0 NaN
1 A1 B1 C1 D1 NaN
2 A2 B2 C2 D2 NaN
3 A3 B3 C3 D3 NaN
2 NaN B2 NaN D2 F2
3 NaN B3 NaN D3 F3
6 NaN B6 NaN D6 F6
7 NaN B7 NaN D7 F7
#等價(jià)于result = pd.concat([df1,df2,df3])
In [29]:result = df1.append([df2,df3])
In [30]:result
Out[30]:
A B C D
0 A0 B0 C0 D0
1 A1 B1 C1 D1
2 A2 B2 C2 D2
3 A3 B3 C3 D3
4 A4 B4 C4 D4
5 A5 B5 C5 D5
6 A6 B6 C6 D6
7 A7 B7 C7 D7
8 A8 B8 C8 D8
9 A9 B9 C9 D9
10 A10 B10 C10 D10
11 A11 B11 C11 D11
1.2.1 橫向合并連接一個(gè)DataFrame和一個(gè)Series
In [31]:s1 = pd.Series(['X0', 'X1', 'X2', 'X3'], name='X')
In [32]:result = pd.concat([df1,s1],axis=1)
Out[32]: result
A B C D X
0 A0 B0 C0 D0 X0
1 A1 B1 C1 D1 X1
2 A2 B2 C2 D2 X2
3 A3 B3 C3 D3 X3
1.2.2 縱向合并連接一個(gè)DataFrame和一個(gè)Series
In [33]:s1 = pd.Series(['X0', 'X1', 'X2', 'X3'], index=['A', 'B', 'C', 'D'])
In [34]:s2
Out[34]:
A X0
B X1
C X2
D X3
dtype: object
result = df1.append(s1)
In [35]:result = df1.append(s2,ignore_index=True)
In [36]:result
Out[36]:
A B C D
0 A0 B0 C0 D0
1 A1 B1 C1 D1
2 A2 B2 C2 D2
3 A3 B3 C3 D3
4 X0 X1 X2 X3
2. 連接數(shù)據(jù)集
merge的語法形式
merge(left, right, how='inner', on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=True,
suffixes=('_x', '_y'), copy=True, indicator=False)
Merge方法與SQL方法比較
Merge SQL join 說明
left LEFT OUTER JOIN 左連接
right RIGHT OUTER JOIN 右連接
outer FULL OUTER JOIN 全連接
inner INNER JOIN 內(nèi)連接
2.1 按照一列標(biāo)簽名相同(列Key)連接
# 數(shù)據(jù)樣集1,只有一列key
In [37]:left = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
In [38]:left
Out[38]:
A B key
0 A0 B0 K0
1 A1 B1 K1
2 A2 B2 K2
3 A3 B3 K3
# 數(shù)據(jù)樣集2,只有一列名均為key
In [39]:right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
In [40]:right
Out[40]:
C D key
0 C0 D0 K0
1 C1 D1 K1
2 C2 D2 K2
3 C3 D3 K3
#merge默認(rèn)為inner join
In [41]:result = pd.merge(left, right, on='key')
In [42]:result
Out[42]:
A B key C D
0 A0 B0 K0 C0 D0
1 A1 B1 K1 C1 D1
2 A2 B2 K2 C2 D2
3 A3 B3 K3 C3 D3
2.2 按照不同列標(biāo)簽名(兩列Key1和Key2)連接
#數(shù)據(jù)樣集1
In [43]:left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],
'key2': ['K0', 'K1', 'K0', 'K1'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
In [44]:left
Out[44]:
A B key1 key2
0 A0 B0 K0 K0
1 A1 B1 K0 K1
2 A2 B2 K1 K0
3 A3 B3 K2 K1
#數(shù)據(jù)樣集2
In [45]:right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
'key2': ['K0', 'K0', 'K0', 'K0'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
In [46]:right
Out[46]:
C D key1 key2
0 C0 D0 K0 K0
1 C1 D1 K1 K0
2 C2 D2 K1 K0
3 C3 D3 K2 K0
2.2.1 inner內(nèi)連接
#等價(jià)于result = pd.merge(left,right,how='inner',on=['key1','key2'])
In [47]:result = pd.merge(left,right,on=['key1','key2'])
In [48]:result
Out[48]:
A B key1 key2 C D
0 A0 B0 K0 K0 C0 D0
1 A2 B2 K1 K0 C1 D1
2 A2 B2 K1 K0 C2 D2
2.2.2 left左連接
In [49]:result = pd.merge(left,right,how='left',on=['key1','key2'])
In [50]:result
Out[50]:
A B key1 key2 C D
0 A0 B0 K0 K0 C0 D0
1 A1 B1 K0 K1 NaN NaN
2 A2 B2 K1 K0 C1 D1
3 A2 B2 K1 K0 C2 D2
4 A3 B3 K2 K1 NaN NaN
2.2.3 right右連接
In [49]:result = pd.merge(left,right,how='right',on=['key1','key2'])
In [50]:result
Out[50]:
A B key1 key2 C D
0 A0 B0 K0 K0 C0 D0
1 A2 B2 K1 K0 C1 D1
2 A2 B2 K1 K0 C2 D2
3 NaN NaN K2 K0 C3 D3
2.2.4 outer右連接
In [51]:result = pd.merge(left,right,how='outer',on=['key1','key2'])
In [52]:result
Out[52]:
A B key1 key2 C D
0 A0 B0 K0 K0 C0 D0
1 A1 B1 K0 K1 NaN NaN
2 A2 B2 K1 K0 C1 D1
3 A2 B2 K1 K0 C2 D2
4 A3 B3 K2 K1 NaN NaN
5 NaN NaN K2 K0 C3 D3
2.3 按照索引連接,格式如A.join(B)
#樣本數(shù)據(jù)集1
In [53]:left = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
'B': ['B0', 'B1', 'B2']},
index=['K0', 'K1', 'K2'])
In [54]:left
Out[54]:
A B
K0 A0 B0
K1 A1 B1
K2 A2 B2
#樣本數(shù)據(jù)集2
In [55]: right = pd.DataFrame({'C': ['C0', 'C2', 'C3'],
'D': ['D0', 'D2', 'D3']},
index=['K0', 'K2', 'K3'])
In [56]:right
Out[56]:
C D
K0 C0 D0
K2 C2 D2
K3 C3 D3
2.3.1 A.join(B)
In [57]:result = left.join(right)
In [58]:result
Out[58]:
A B C D
K0 A0 B0 C0 D0
K1 A1 B1 NaN NaN
K2 A2 B2 C2 D2
2.3.2 A.join(B,how='outer')
#等價(jià)于 result = pd.merge(left, right, left_index=True, right_index=True, how='outer')
In [59]:result = left.join(right,how='outer')
In [60]:result
Out[60]:
A B C D
K0 A0 B0 C0 D0
K1 A1 B1 NaN NaN
K2 A2 B2 C2 D2
K3 NaN NaN C3 D3
2.3.3 A.join(B,how='inner')
#等價(jià)于 result = pd.merge(left, right, left_index=True, right_index=True, how='inner')
In [61]:result = left.join(right,how='inner')
In [62]:result
Out[62]:
A B C D
K0 A0 B0 C0 D0
K2 A2 B2 C2 D2
2.4 連接時(shí)一個(gè)是列一個(gè)是索引
#樣本數(shù)據(jù)集1
In [63]:left = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'key': ['K0', 'K1', 'K0', 'K1']})
In [64]:left
Out[64]:
A B key
0 A0 B0 K0
1 A1 B1 K1
2 A2 B2 K0
3 A3 B3 K1
#樣本數(shù)據(jù)集2
In [65]:right = pd.DataFrame({'C': ['C0', 'C1'],
'D': ['D0', 'D1']},
index=['K0', 'K1'])
In [66]:right
Out[66]:
C D
K0 C0 D0
K1 C1 D1
In [67]:result = left.join(right,on='key')
In [68]:result
Out[68]:
A B key C D
0 A0 B0 K0 C0 D0
1 A1 B1 K1 C1 D1
2 A2 B2 K0 C0 D0
3 A3 B3 K1 C1 D1
#等價(jià)于
result = pd.merge(left, right, left_on='key', right_index=True,
how='left', sort=False);