python pandas.merge 合并处理两个DataFr
2019-10-23 本文已影响0人
悟空Oo
该函数可以根据这两个DataFrame的列名(columns)或者行名(索引,indexes)进行合并,如果按照列名进行合并(这也是默认的left_index=False, right_index=False
),行名(索引,index)就会重新排部;当然在left_index=True, right_index=True
情况下,会按照行名合并,自然也就会保留行名。参考官方文档pandas.merge
pandas.merge
(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None)
代码实例:
import pandas as pd
def make_df(cols, ind):
data = {c:[str(c)+str(i) for i in ind ] for c in cols}
return pd.DataFrame(data,ind)
##先声明几个dataframe
>>> dfABC = make_df('ABC',range(4))
>>> dfABC
A B C
0 A0 B0 C0
1 A1 B1 C1
2 A2 B2 C2
3 A3 B3 C3
>>> dfCDE = make_df('CDE',range(2,5))
>>> dfCDE
C D E
2 C2 D2 E2
3 C3 D3 E3
4 C4 D4 E4
>>> dfDEF = make_df('DEF',range(5))
>>> dfDEF
D E F
0 D0 E0 F0
1 D1 E1 F1
2 D2 E2 F2
3 D3 E3 F3
4 D4 E4 F4
>>> dfdeF = dfDEF.copy()
>>> dfdeF.rename(columns={'D':'d', 'E':'e'},index={0: "x", 1: "y", 2: "z"}, inplace = True)
>>> dfdeF
d e F
x D0 E0 F0
y D1 E1 F1
z D2 E2 F2
3 D3 E3 F3
4 D4 E4 F4
- how : {‘left’, ‘right’, ‘outer’, ‘inner’}, default ‘inner’
-
how='left
左连接,以双方都有的列为依据,如果右边的数据没有该值则NaN补充 ; -
how='right
右连接,以双方都有的列为依据,如果左边的数据没有该值则NaN补充 ; -
how='inner
取双方的交集 ; -
how='outer
取双方的幷集,以双方都有的列为依据,如果双方都数据没有该值则NaN补充 ;
>>> pd.merge(dfABC,dfCDE,how='left') #注意保留了左数据C列的"C0,C1,C2,C3";并且重新排布了行索引
A B C D E
0 A0 B0 C0 NaN NaN
1 A1 B1 C1 NaN NaN
2 A2 B2 C2 D2 E2
3 A3 B3 C3 D3 E3
>>> pd.merge(dfABC,dfCDE,how='right') #注意保留了右数据C列的"C2,C3,C4";并且重新排布了行索引
A B C D E
0 A2 B2 C2 D2 E2
1 A3 B3 C3 D3 E3
2 NaN NaN C4 D4 E4
>>> pd.merge(dfABC,dfCDE,how='inner') #注意只保留了两数据C列中共有的"C2,C3";并且重新排布了行索引
A B C D E
0 A2 B2 C2 D2 E2
1 A3 B3 C3 D3 E3
>>> pd.merge(dfABC,dfCDE,how='outer') #注意保留了左数据C列的所有值("C0,C1,C2,C3,C4 ");并且重新排布了行索引
A B C D E
0 A0 B0 C0 NaN NaN
1 A1 B1 C1 NaN NaN
2 A2 B2 C2 D2 E2
3 A3 B3 C3 D3 E3
4 NaN NaN C4 D4 E4
-
on=None
,on: label or list,如果两数据有两个及以上的共有列,可以设置该值进行选择单一列或者其中几列进行合并,当指定单一列时,其他共有列的列名会加上'_x','_y'进行区分(或者通过suffixes
进行设置,suffixes : tuple of (str, str), default (‘_x’, ‘_y’)),该参数也可以对行进行操作;
>>> pd.merge(dfCDE,dfDEF,how = 'outer') #两个公共列'D'和'E',同样注意重新排布了行索引
C D E F
0 C2 D2 E2 F2
1 C3 D3 E3 F3
2 C4 D4 E4 F4
3 NaN D0 E0 F0
4 NaN D1 E1 F1
>>> pd.merge(dfCDE,dfDEF,how = 'outer',on = 'D') # 注意其他共有列的列名自动加上'_x','_y'进行区分,同样注意重新排布了行索引
C D E_x E_y F
0 C2 D2 E2 E2 F2
1 C3 D3 E3 E3 F3
2 C4 D4 E4 E4 F4
3 NaN D0 NaN E0 F0
4 NaN D1 NaN E1 F1
>>> pd.merge(dfCDE,dfDEF,how = 'outer',on = 'D',suffixes = ('_of_theleft','_of_theright')) #设置了suffixes
C D E_of_theleft E_of_theright F
0 C2 D2 E2 E2 F2
1 C3 D3 E3 E3 F3
2 C4 D4 E4 E4 F4
3 NaN D0 NaN E0 F0
4 NaN D1 NaN E1 F1
>>> pd.merge(dfCDE,dfDEF,how = 'outer',on =['D','E']) #这样设置的结果和pd.merge(dfCDE,dfDEF,how = 'outer')结果一样,因为两数据的共有列也就是['D','E'],同样注意重新排布了行索引
C D E F
0 C2 D2 E2 F2
1 C3 D3 E3 F3
2 C4 D4 E4 F4
3 NaN D0 E0 F0
4 NaN D1 E1 F1
-
left_on=None, right_on=None
,left_on: label or list, or array-like; right_on: label or list, or array-like 如果两数据的列中虽然列名不同但是其列值有相同,则可以通过设置该值进行合并 ;
>>> pd.merge(dfCDE,dfdeF) #因为没有公共列所以抛出异常 pandas.errors.MergeError
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
pandas.errors.MergeError: No common columns to perform merge on. Merge options: left_on=None, right_on=None, left_index=False, right_index=False
>>> pd.merge(dfCDE,dfdeF,left_on='D',right_on='d') #通过设置left_on,right_on的值进行合并,同样注意重新排布了行索引
C D E d e F
0 C2 D2 E2 D2 E2 F2
1 C3 D3 E3 D3 E3 F3
2 C4 D4 E4 D4 E4 F4
>>> pd.merge(dfCDE,dfdeF,left_on='D',right_on='e') #可是如果连列值都不一样就空了
Empty DataFrame
Columns: [C, D, E, d, e, F]
Index: []
>>> pd.merge(dfCDE,dfdeF,left_on='D',right_on='e',how = 'outer') #同样注意重新排布了行索引
C D E d e F
0 C2 D2 E2 NaN NaN NaN
1 C3 D3 E3 NaN NaN NaN
2 C4 D4 E4 NaN NaN NaN
3 NaN NaN NaN D0 E0 F0
4 NaN NaN NaN D1 E1 F1
5 NaN NaN NaN D2 E2 F2
6 NaN NaN NaN D3 E3 F3
7 NaN NaN NaN D4 E4 F4
-
left_index=True, right_index=True
设置该值会按照行名合并,会保留行名
>>> pd.merge(dfCDE,dfdeF,left_index=True,right_index=True) #注意保留了行名(index)
C D E d e F
3 C3 D3 E3 D3 E3 F3
4 C4 D4 E4 D4 E4 F4
>>> pd.merge(dfCDE,dfdeF,left_index=True,right_index=True,how = 'outer') #注意保留了行名(index)
C D E d e F
2 C2 D2 E2 NaN NaN NaN
3 C3 D3 E3 D3 E3 F3
4 C4 D4 E4 D4 E4 F4
x NaN NaN NaN D0 E0 F0
y NaN NaN NaN D1 E1 F1
z NaN NaN NaN D2 E2 F2
-
copy=True
,indicator=False
,validate=None
请参考官方文档吧!
最后,这是什么鬼?
>>> pd.merge(dfCDE,dfdeF,left_index=True,right_index=True,left_on=['E'],right_on=['e'],how = 'outer')
C D E d e F
2 C2 D2 E2 NaN NaN NaN
3 C3 D3 E3 D3 E3 F3
4 C4 D4 E4 D4 E4 F4
x NaN NaN x D0 E0 F0
y NaN NaN y D1 E1 F1
z NaN NaN z D2 E2 F2
Does anyone can explain the 'x','y','z' in the values?