美文网首页Python
python pandas.merge 合并处理两个DataFr

python pandas.merge 合并处理两个DataFr

作者: 悟空Oo | 来源:发表于2019-10-23 11:39 被阅读0次

    该函数可以根据这两个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=Noneon: 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=Noneleft_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
    

    最后,这是什么鬼?

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

    相关文章

      网友评论

        本文标题:python pandas.merge 合并处理两个DataFr

        本文链接:https://www.haomeiwen.com/subject/pilumctx.html