python pandas.merge 合并处理两个DataFrame或者DataFrame和Series

该函数可以根据这两个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?
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,012评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,628评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,653评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,485评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,574评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,590评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,596评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,340评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,794评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,102评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,276评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,940评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,583评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,201评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,441评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,173评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,136评论 2 352