Python

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

最后,这是什么鬼?

>>> 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?
上一篇下一篇

猜你喜欢

热点阅读