关于pandas merge 合并操作的讲解

pandas 中的merge是一种功能比较强大的用于两个DataFrame或者Series进行合并的方法.

合并时会将所有的列进行合并,但是指定键值不存在行列会填充NaN.


直接复制官方文档 :
DataFrame.merge(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)

常用参数解释:

  1. right : DataFrame or named Series:

    • 当使用pandas.merge()时,right处实际填入两个待合并的结构;当使用dataframe.merge()时,right处仅填入一个待合并的结构,此处的right与dataframe分别作为右/左结构.
  2. how : {‘left’, ‘right’, ‘outer’, ‘inner’}, default ‘inner’:

    • how指定了结构的融合的类型,是一个关于key的重要参数
    • 默认inner,即采用交叉部分的key作为列的内容
    • left: 即选取左侧结构的key作为列的内容
    • right: 即选取左侧结构的key作为列的内容
    • outer: 选取所有的键作为列内容.
    • 不存在的内容用NaN填充
  3. on : label or list
    Column or index level names to join on. These must be found in both DataFrames.

    • 参数on指定了用于合并的键key.
    • 参数on指定的键必须是两个结构中共有的.
  4. indicator : bool or str, default False
    If True, adds a column to output DataFrame called “_merge” with information on the source of each row.

    • indicator 用于指示说明该行所用的键来自于哪一边结构.
  5. left_index : bool, default False
    Use the index from the left DataFrame as the join key(s).

    • left_index 设定为True, 即根据左侧结构的index进行merge. 而不再是根据某一columns.
  6. right_index : bool, default False
    Use the index from the right DataFrame as the join key. Same caveats as left_index.

    • right_index 与 left_index同时使用.即根据两个结构的index进行merge.
  1. suffixes : tuple of (str, str), default (‘_x’, ‘_y’)
    Suffix to apply to overlapping column names in the left and right side, respectively. To raise an exception on overlapping columns use (False, False).
    • suffixes 主要用于解决两个合并结构的列存在交叉的情况.
    • 通过suffixes 的指定,名字相同可以在merge后使用不同的列名,并同时存在.

代码:

In:df1 = pd.DataFrame({'A':['A0','A1','A2'],'B':['B0','B1','B2']},index=['KO','K1','K2'])
   df2 = pd.DataFrame({'C':['C0','C2','C3'],'D':['D0','D2','D3']},index=['KO','K1','K2'])

In: df1
Out:    
        A    B
  KO    A0  B0
  K1    A1  B1
  K2    A2  B2

In: df1
Out: 
     C   D
KO  C0  D0
K1  C2  D2
K2  C3  D3
# 打开left_index 和 right_index ,how='inner'即根据行进行merge, 合并的类型是采用交叉部分(index部分的交叉)进行合并.
In: res = pd.merge(df1,df2,left_index=True,right_index=True,how='inner')
In: res
Out: 
     A  B   C   D
KO  A0  B0  C0  D0
K1  A1  B1  C2  D2
K2  A2  B2  C3  D3
In: df1 = pd.DataFrame({'lkey1':['foo','bar','baz','foo'],'value':[1,2,3,4],'rkey':['ab','bc','cd','ef']})
    df2 = pd.DataFrame({'rkey': ['foo', 'bar', 'baz', 'foooo'],'value': [4, 6, 7, 8],'xxx':[1,23,4,5]})
In: df1
Out: 
    lkey1   value   rkey
0   foo       1     ab
1   bar       2     bc
2   baz       3     cd
3   foo       4     ef

In: df2
Out: 
    rkey    value   xxx
0   foo       4     1
1   bar       6     23
2   baz       7     4
3   foooo     8     5

# 基于value键,使用left类型进行合并.合并结果中的value只采用df1中value值,对于df2中不存在value值对应行的情况直接填充NaN(例如value1/2/3)
In: pd.merge(df1,df2,how='left',on = 'value')
Out: 
    lkey1   value   rkey_x  rkey_y  xxx
0   foo        1    ab       NaN    NaN
1   bar        2    bc       NaN    NaN
2   baz        3    cd       NaN    NaN
3   foo        4    ef       foo    1.0

注意到在上一段代码的运行结果中,重叠部分即rkey列,在融合后自动添加了x和y后缀,避免了重叠.这里也可以利用suffixes对后缀进行指定

In:  boys = pd.DataFrame({'k':['K0','K1','K2'],'age':['1','2','3'],'name':['b1','b2','b3']})
     girls = pd.DataFrame({'k':['K0','K0','K3'],'age':['4','5','6'],'name':['g1','g2','g3']})
In: boys
Out: 
    k   age name
0   K0  1   b1
1   K1  2   b2
2   K2  3   b3

In: girls
Out: 

    k   age name
0   K0  4   g1
1   K0  5   g2
2   K3  6   g3

# 针对name和age列存在重叠情况. 使用suffixes指明了后缀
In: pd.merge(boys,girls,suffixes=['_boys','_girls'],on = 'k',how=  'inner')
Out:

     k    age_boys  name_boys   age_girls   name_girls
0   K0        1       b1          4         g1
1   K0        1       b1          5         g2

In: pd.merge(boys,girls,suffixes=['_boys','_girls'],on = ['k','age'] ,how=  'left')
Out:

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