Pandas数据合并

merage

<em> 内连接</em>

<em> 左外连接</em>

<em> 右外连接</em>

<em> 全外连接</em>

<em> 示例</em>

<B>join</B>

<B>concat</B>

merage#

<em>pandas提供了一个类似于关系数据库的连接(join)操作的方法<Strong>merage</Strong>,可以根据一个或多个键将不同DataFrame中的行连接起来</em>

<em>语法如下</em>

merge(left, right, how='inner', on=None, left_on=None, right_on=None,
      left_index=False, right_index=False, sort=True,
      suffixes=('_x', '_y'), copy=True, indicator=False)

参数说明:

  1. left与right:两个不同的DataFrame
  2. how:指的是合并(连接)的方式有inner(内连接),left(左外连接),right(右外连接),outer(全外连接);默认为inner
  3. on : 指的是用于连接的列索引名称。必须存在右右两个DataFrame对象中,如果没有指定且其他参数也未指定则以两个DataFrame的列名交集做为连接键
  4. left_on:左则DataFrame中用作连接键的列名;这个参数中左右列名不相同,但代表的含义相同时非常有用。
  5. right_on:右则DataFrame中用作 连接键的列名
  6. left_index:使用左则DataFrame中的行索引做为连接键
  7. right_index:使用右则DataFrame中的行索引做为连接键
  8. sort:默认为True,将合并的数据进行排序。在大多数情况下设置为False可以提高性能
  9. suffixes:字符串值组成的元组,用于指定当左右DataFrame存在相同列名时在列名后面附加的后缀名称,默认为('_x','_y')
  10. copy:默认为True,总是将数据复制到数据结构中;大多数情况下设置为False可以提高性能
  11. indicator:在 0.17.0中还增加了一个显示合并数据中来源情况;如只来自己于左边(left_only)、两者(both)

内连接##

<em>符合连接条件和查询条件的数据行,相当于数据库中的jion,示例SQL语句 </em>

SELECT *
FROM df1
INNER JOIN df2
  ON df1.key = df2.key;

SELECT *
FROM df1,df2 where df1.key=df2.key

<em>对应pandas语句</em>

pd.merge(df1, df2, on='key')

左外连接##

<em>符合连接条件和查询条件的数据行并返回左表中不符合连接条件单符合查询条件的数据行,相当于数据库中的left outer join,示例SQL语句 </em>

-- show all records from df1
SELECT *
FROM df1
LEFT OUTER JOIN df2
  ON df1.key = df2.key;

<em>对应pandas语句</em>

pd.merge(df1, df2, on='key', how='left')

右外连接##

<em>符合连接条件和查询条件的数据行并返回右表中不符合连接条件单符合查询条件的数据行,相当于数据库中的right outer join,示例SQL语句 </em>

-- show all records from df2
SELECT *
FROM df1
RIGHT OUTER JOIN df2
  ON df1.key = df2.key;

<em>对应pandas语句</em>

pd.merge(df1, df2, on='key', how='right')

全外连接##

<em>符合连接条件和查询条件的数据行并返回左表和左表中不符合连接条件单符合查询条件的数据行。全外连接相当于左外连接与左外连接的合集(去掉重复),相当于数据库中的full outer join,示例SQL语句 </em>

-- show all records from both tables
SELECT *
FROM df1
FULL OUTER JOIN df2
  ON df1.key = df2.key;

<em>对应pandas语句</em>

pd.merge(df1, df2, on='key', how='outer')

更详细的参见官方网站

示例##

#coding=utf-8
from pandas import Series,DataFrame,merge
import numpy as np
data=DataFrame([{"id":0,"name":'lxh',"age":20,"cp":'lm'},{"id":1,"name":'xiao',"age":40,"cp":'ly'},{"id":2,"name":'hua',"age":4,"cp":'yry'},{"id":3,"name":'be',"age":70,"cp":'old'}])
data1=DataFrame([{"id":100,"name":'lxh','cs':10},{"id":101,"name":'xiao','cs':40},{"id":102,"name":'hua2','cs':50}])
data2=DataFrame([{"id":0,"name":'lxh','cs':10},{"id":101,"name":'xiao','cs':40},{"id":102,"name":'hua2','cs':50}])

print "单个列名做为内链接的连接键\r\n",merge(data,data1,on="name",suffixes=('_a','_b'))
print "多列名做为内链接的连接键\r\n",merge(data,data2,on=("name","id"))
print '不指定on则以两个DataFrame的列名交集做为连接键\r\n',merge(data,data2) #这里使用了id与name

#使用右边的DataFrame的行索引做为连接键
##设置行索引名称
indexed_data1=data1.set_index("name")
print "使用右边的DataFrame的行索引做为连接键\r\n",merge(data,indexed_data1,left_on='name',right_index=True)


print '左外连接\r\n',merge(data,data1,on="name",how="left",suffixes=('_a','_b'))
print '左外连接1\r\n',merge(data1,data,on="name",how="left")
print '右外连接\r\n',merge(data,data1,on="name",how="right")
data3=DataFrame([{"mid":0,"mname":'lxh','cs':10},{"mid":101,"mname":'xiao','cs':40},{"mid":102,"mname":'hua2','cs':50}])

#当左右两个DataFrame的列名不同,当又想做为连接键时可以使用left_on与right_on来指定连接键
print "使用left_on与right_on来指定列名字不同的连接键\r\n",merge(data,data3,left_on=["name","id"],right_on=["mname","mid"])

输出

单个列名做为内链接的连接键
   age  cp  id_a  name  cs  id_b
0   20  lm     0   lxh  10   100
1   40  ly     1  xiao  40   101
多列名做为内链接的连接键
   age  cp  id name  cs
0   20  lm   0  lxh  10
不指定on则以两个DataFrame的列名交集做为连接键
   age  cp  id name  cs
0   20  lm   0  lxh  10
使用右边的DataFrame的行索引做为连接键
   age  cp  id_x  name  cs  id_y
0   20  lm     0   lxh  10   100
1   40  ly     1  xiao  40   101
左外连接
   age   cp  id_a  name  cs  id_b
0   20   lm     0   lxh  10   100
1   40   ly     1  xiao  40   101
2    4  yry     2   hua NaN   NaN
3   70  old     3    be NaN   NaN
左外连接1
   cs  id_x  name  age   cp  id_y
0  10   100   lxh   20   lm     0
1  40   101  xiao   40   ly     1
2  50   102  hua2  NaN  NaN   NaN
右外连接
   age   cp  id_x  name  cs  id_y
0   20   lm     0   lxh  10   100
1   40   ly     1  xiao  40   101
2  NaN  NaN   NaN  hua2  50   102
使用left_on与right_on来指定列名字不同的连接键
   age  cp  id name  cs  mid mname
0   20  lm   0  lxh  10    0   lxh

join#

<em>join方法提供了一个简便的方法用于将两个DataFrame中的不同的列索引合并成为一个DataFrame</em>

join(self, other, on=None, how='left', lsuffix='', rsuffix='',
             sort=False):

其中参数的意义与merge方法基本相同,只是join方法默认为左外连接how=left

示例

#coding=utf-8
from pandas import Series,DataFrame,merge

data=DataFrame([{"id":0,"name":'lxh',"age":20,"cp":'lm'},{"id":1,"name":'xiao',"age":40,"cp":'ly'},{"id":2,"name":'hua',"age":4,"cp":'yry'},{"id":3,"name":'be',"age":70,"cp":'old'}],index=['a','b','c','d'])
data1=DataFrame([{"sex":0},{"sex":1},{"sex":2}],index=['a','b','e'])

print '使用默认的左连接\r\n',data.join(data1)  #这里可以看出自动屏蔽了data中没有的index=e 那一行的数据
print '使用右连接\r\n',data.join(data1,how="right") #这里出自动屏蔽了data1中没有index=c,d的那行数据;等价于data1.join(data)
print '使用内连接\r\n',data.join(data1,how='inner')
print '使用全外连接\r\n',data.join(data1,how='outer')

输出

使用默认的左连接
   age   cp  id  name  sex
a   20   lm   0   lxh    0
b   40   ly   1  xiao    1
c    4  yry   2   hua  NaN
d   70  old   3    be  NaN
使用右连接
   age   cp  id  name  sex
a   20   lm   0   lxh    0
b   40   ly   1  xiao    1
e  NaN  NaN NaN   NaN    2
使用内连接
   age  cp  id  name  sex
a   20  lm   0   lxh    0
b   40  ly   1  xiao    1
使用全外连接
   age   cp  id  name  sex
a   20   lm   0   lxh    0
b   40   ly   1  xiao    1
c    4  yry   2   hua  NaN
d   70  old   3    be  NaN
e  NaN  NaN NaN   NaN    2

concat#

<em>concat方法相当于数据库中的全连接(UNION ALL),可以指定按某个轴进行连接,也可以指定连接的方式join(outer,inner 只有这两种)。与数据库不同的时concat不会去重,要达到去重的效果可以使用drop_duplicates方法</em>

 concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,
           keys=None, levels=None, names=None, verify_integrity=False, copy=True):

参数说明

Parameters

----------
objs : a sequence or mapping of Series, DataFrame, or Panel objects
    If a dict is passed, the sorted keys will be used as the `keys`
    argument, unless it is passed, in which case the values will be
    selected (see below). Any None objects will be dropped silently unless
    they are all None in which case a ValueError will be raised
axis : {0, 1, ...}, default 0
    The axis to concatenate along
join : {'inner', 'outer'}, default 'outer'
    How to handle indexes on other axis(es)
join_axes : list of Index objects
    Specific indexes to use for the other n - 1 axes instead of performing
    inner/outer set logic
verify_integrity : boolean, default False
    Check whether the new concatenated axis contains duplicates. This can
    be very expensive relative to the actual data concatenation
keys : sequence, default None
    If multiple levels passed, should contain tuples. Construct
    hierarchical index using the passed keys as the outermost level
levels : list of sequences, default None
    Specific levels (unique values) to use for constructing a
    MultiIndex. Otherwise they will be inferred from the keys
names : list, default None
    Names for the levels in the resulting hierarchical index
ignore_index : boolean, default False
    If True, do not use the index values along the concatenation axis. The
    resulting axis will be labeled 0, ..., n - 1. This is useful if you are
    concatenating objects where the concatenation axis does not have
    meaningful indexing information. Note the the index values on the other
    axes are still respected in the join.
copy : boolean, default True
    If False, do not copy data unnecessarily

示例

#coding=utf-8
from pandas import Series,DataFrame,concat

df1 = DataFrame({'city': ['Chicago', 'San Francisco', 'New York City'], 'rank': range(1, 4)})
df2 = DataFrame({'city': ['Chicago', 'Boston', 'Los Angeles'], 'rank': [1, 4, 5]})
print '按轴进行内连接\r\n',concat([df1,df2],join="inner",axis=1)
print '进行外连接并指定keys(行索引)\r\n',concat([df1,df2],keys=['a','b']) #这里有重复的数据
print '去重后\r\n',concat([df1,df2],ignore_index=True).drop_duplicates()

输出

按轴进行内连接
            city  rank         city  rank
0        Chicago     1      Chicago     1
1  San Francisco     2       Boston     4
2  New York City     3  Los Angeles     5
进行外连接并指定keys(行索引)
              city  rank
a 0        Chicago     1
  1  San Francisco     2
  2  New York City     3
b 0        Chicago     1
  1         Boston     4
  2    Los Angeles     5
去重后
            city  rank
0        Chicago     1
1  San Francisco     2
2  New York City     3
4         Boston     4
5    Los Angeles     5

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

推荐阅读更多精彩内容