pandas对象中的数据可以通过一些内置的方式进行合并:

pandas.merge 可根据一个或多个键将不同的DataFrame中的行连接起来。

pandas.concat可以沿着一条轴将多个对象堆叠到一起

实例的方法conbine_first 可以将重复的数据编接到一起,用一个对象中的值填充另一个对象的缺失值。

数据库风格的DataFrame合并

In [51]: df1 = DataFrame({'key':['b','b','a','c','a','a','b'],'data1':range(7)})
In [53]: df2 = DataFrame({'key':['a','b','d'],'data2':range(3)}) In [54]: df1
Out[54]:
data1 key
0 0 b
1 1 b
2 2 a
3 3 c
4 4 a
5 5 a
6 6 b In [55]: df2
Out[55]:
data2 key
0 0 a
1 1 b
2 2 d In [56]: pd.merge(df1,df2)
Out[56]:
data1 key data2
0 0 b 1
1 1 b 1
2 6 b 1
3 2 a 0
4 4 a 0
5 5 a 0

默认不显式指明用哪个键进行连接的时候,merge会将重叠列的列名当做键。不过,最好显式的指明:

In [57]: pd.merge(df1,df2,on = 'key')

如果两个列的列名不同,可以分别指定

In [58]: df4 = DataFrame({'key-r':['a','b','d'],'data2':range(3)})

In [59]: df3 = DataFrame({'key-l':['b','b','a','c','a','a','b'],'data1':range(7)})

In [63]: pd.merge(df3,df4,left_on = 'key-l',right_on = 'key-r')
Out[63]:
data1 key-l data2 key-r
0 0 b 1 b
1 1 b 1 b
2 6 b 1 b
3 2 a 0 a
4 4 a 0 a
5 5 a 0 a

默认情况下,merge做的是‘inner’连接,merge还有left、right和outer:

In [64]: pd.merge(df1,df2,how='outer')
Out[64]:
data1 key data2
0 0.0 b 1.0
1 1.0 b 1.0
2 6.0 b 1.0
3 2.0 a 0.0
4 4.0 a 0.0
5 5.0 a 0.0
6 3.0 c NaN
7 NaN d 2.0

如果要根据多个键进行合并,传入一个由列名组成的列表即可。

In [65]: left = DataFrame({'key1':['a','a','b'],'key2':['one','two','one'],'lrow':[1,2,3]})

In [66]: right = DataFrame({'key1':['a','a','b','b'],'key2':['one','one','one','two'],'rrow':[4,5,6,7]})

In [67]: pd.merge(left,right,on = ['key1','key2'])
Out[67]:
key1 key2 lrow rrow
0 a one 1 4
1 a one 1 5
2 b one 3 6

如果合并的列中存在重复的列,可以指定重复的列的后缀进行区分

In [68]: pd.merge(left,right,on = ['key1'])
Out[68]:
key1 key2_x lrow key2_y rrow
0 a one 1 one 4
1 a one 1 one 5
2 a two 2 one 4
3 a two 2 one 5
4 b one 3 one 6
5 b one 3 two 7
#指定列名
In [71]: pd.merge(left,right,on = ['key1'],suffixes=['_eft','_right'])
Out[71]:
key1 key2_eft lrow key2_right rrow
0 a one 1 one 4
1 a one 1 one 5
2 a two 2 one 4
3 a two 2 one 5
4 b one 3 one 6
5 b one 3 two 7

索引上的合并

有时候,DataFrame中的连接键位于其索引中,merge可以通过left_index = True 或 right_index =True 来讲索引应用于连接键。

In [73]: left = DataFrame({'key':['a','b','a','a','b','c'],'value':range(6)})
In [75]: right = DataFrame({'group_val':[3.5,7]},index=['a','b']) In [76]: pd.merge(left,right,left_on = 'key',right_index= True)
Out[76]:
key value group_val
0 a 0 3.5
2 a 2 3.5
3 a 3 3.5
1 b 1 7.0
4 b 4 7.0

对于层次化的索引,需要对应的left_on = ['key1','key2'] , right_index = True

pandas的数据合并

轴向连接

另一种合并运算也叫做连接、绑定或堆叠。

numpy有一个用于原始合并Numpy数组的concatenation函数

>>> arr = np.arange(12).reshape(3,4)

>>> arr

array([[ 0,  1,  2,  3],

[ 4,  5,  6,  7],

[ 8,  9, 10, 11]])

>>> np.concatenate([arr,arr])

array([[ 0,  1,  2,  3],

[ 4,  5,  6,  7],

[ 8,  9, 10, 11],

[ 0,  1,  2,  3],

[ 4,  5,  6,  7],

[ 8,  9, 10, 11]])

>>> np.concatenate([arr,arr],axis =1)

array([[ 0,  1,  2,  3,  0,  1,  2,  3],

[ 4,  5,  6,  7,  4,  5,  6,  7],

[ 8,  9, 10, 11,  8,  9, 10, 11]])

pandas的concat函数提供了解决类似上述数组的链接操作。并且能够解决下述问题:

1、如果各个对象其他轴上的索引不同,合并的时候是采用交集还是并集。

2、结果对象中的分组需要各不相同吗?

3、用于连接的轴的重要性。

以Series为例

>>> s1 = Series(['0','1'],index = ['a','b'])

>>> s2 = Series([2,3,4],index = ['c','d','e'])

>>> s3 = Series({'f':5,'g':6})

>>> s1

a    0

b    1

dtype: object

>>> s3

f    5

g    6

dtype: int64

>>> pd.concat((s1,s2,s3))

a    0

b    1

c    2

d    3

e    4

f    5

g    6

dtype: object

>>>

默认情况下concat是在axis=0轴上工作的,生成一个新的Series。如果设定axis =1,就会生成一个DataFrame对象。

>>> pd.concat((s1,s2,s3),axis=1)

0    1    2

a    0  NaN  NaN

b    1  NaN  NaN

c  NaN  2.0  NaN

d  NaN  3.0  NaN

e  NaN  4.0  NaN

f  NaN  NaN  5.0

g  NaN  NaN  6.0

上面的情况,都是另外一条轴上没有重叠

如果另外一条轴上有重叠的话,会发生什么呢?

>>> s4

a    00000

b    11111

f        5

g        6

dtype: object

>>> pd.concat((s1,s4),axis =1)

0      1

a    0  00000

b    1  11111

f  NaN      5

g  NaN      6

默认是取并集的,如果是要取交集,只需要传入join = ‘inner’

>>> pd.concat((s1,s4),axis =1,join='inner')

0      1

a  0  00000

b  1  11111

你可以通过join_axes指定要在其他轴上使用的索引。

>>> pd.concat((s1,s4),axis =1,join_axes = (['a','c','b','e'],))

0      1

a    0  00000

c  NaN    NaN

b    1  11111

e  NaN    NaN

在连接轴上创建一个层次化索引。用keys参数。

>>>

>>> result = pd.concat([s1,s1,s3],keys = ['one','two','three'])

>>> result

one    a    0

b    1

two    a    0

b    1

three  f    5

g    6

dtype: object

如果定义axis的话,就会形成一个DataFrame对象,并且将keys作为列头。

对于DataFrame也一样,只不过会生成层次化索引,默认是行索引。

In [12]: df1 = DataFrame(np.arange(6).reshape(3,2),index = ['a','b','c'],columns = ['one','two'])

In [13]: df2 =DataFrame(np.arange(4).reshape(2,2),index= ['a','c'],columns = ['three','four'])

In [14]: df1

Out[14]:

one  two

a    0    1

b    2    3

c    4    5

In [15]: df2

Out[15]:

three  four

a      0     1

c      2     3

In [16]: pd.concat([df1,df2],keys = ['item1','item2'])

Out[16]:

four  one  three  two

item1 a   NaN  0.0    NaN  1.0

b   NaN  2.0    NaN  3.0

c   NaN  4.0    NaN  5.0

item2 a   1.0  NaN    0.0  NaN

c   3.0  NaN    2.0  NaN

In [17]: pd.concat([df1,df2],keys = ['item1','item2'],axis = 1)

Out[17]:

item1     item2

one two three four

a     0   1   0.0  1.0

b     2   3   NaN  NaN

c     4   5   2.0  3.0

如果传入的不是一个列表,而是一个字典,则字典的键就会被当做keys选项的值

In [21]: pd.concat({'level1':df1,'level2':df2},axis =1)

Out[21]:

level1     level2

one two  three four

a      0   1    0.0  1.0

b      2   3    NaN  NaN

c      4   5    2.0  3.0

此外,还有两个管理层次化索引创建方式的参数,name和levels

连接轴上的索引与分析工作无关的话,可以用ignore_index忽略即可。

In [25]: df1 = DataFrame(np.random.randn(3,4),columns=['a','b','c','d'])

In [26]: df2 = DataFrame(np.random.randn(2,3),columns = ['b','d','a'])

In [27]: pd.concat([df1,df2])

Out[27]:

a         b         c         d

0 -0.859642 -0.637505 -0.830966  0.378526

1 -0.614132  1.692308  0.600534 -0.879568

2 -0.004405 -1.271789 -0.825860  0.528685

0 -1.219479 -0.626997       NaN -2.449499

1  0.366940  1.175266       NaN  0.434918

In [28]: pd.concat([df1,df2],ignore_index = True)

Out[28]:

a         b         c         d

0 -0.859642 -0.637505 -0.830966  0.378526

1 -0.614132  1.692308  0.600534 -0.879568

2 -0.004405 -1.271789 -0.825860  0.528685

3 -1.219479 -0.626997       NaN -2.449499

4  0.366940  1.175266       NaN  0.434918

合并重叠数据:

有索引或部分索引重叠的两个数据集。如果要合并这两个数据集,可用Series和DataFrame的combine_first方法

In [32]: a = Series([np.nan,2.5,np.nan,3.5,4.5,np.nan],index = ['f','e','d','c','b','a'])

In [33]: b =Series(np.arange((len(a)),dtype = np.float64),index = ['f','e','d','c','b','a'])

In [34]: b[:-2]

Out[34]:

f    0.0

e    1.0

d    2.0

c    3.0

dtype: float64

In [35]: a[2:]

Out[35]:

d    NaN

c    3.5

b    4.5

a    NaN

dtype: float64

In [36]: b[:-2].combine_first(a[2:])

Out[36]:

a    NaN

b    4.5

c    3.0

d    2.0

e    1.0

f    0.0

dtype: float64

In [37]: b

Out[37]:

f    0.0

e    1.0

d    2.0

c    3.0

b    4.0

a    5.0

dtype: float64

In [38]: b.combine_first(a)

Out[38]:

f    0.0

e    1.0

d    2.0

c    3.0

b    4.0

a    5.0

dtype: float64

In [39]: a.combine_first(b)

Out[39]:

f    0.0

e    2.5

d    2.0

c    3.5

b    4.5

a    5.0

dtype: float64

combine_first方法可以给调用者的缺失值数据“打补丁”,即用被调用者的非na值代替调用者的缺失值。

pandas(七)数据规整化:清理、转换、合并、重塑之合并数据集的更多相关文章

  1. Python之数据规整化:清理、转换、合并、重塑

    Python之数据规整化:清理.转换.合并.重塑 1. 合并数据集 pandas.merge可根据一个或者多个不同DataFrame中的行连接起来. pandas.concat可以沿着一条轴将多个对象 ...

  2. 《python for data analysis》第七章,数据规整化

    <利用Python进行数据分析>第七章的代码. # -*- coding:utf-8 -*-# <python for data analysis>第七章, 数据规整化 imp ...

  3. 利用python进行数据分析之数据规整化

    数据分析和建模大部分时间都用在数据准备上,数据的准备过程包括:加载,清理,转换与重塑. 合并数据集 pandas对象中的数据可以通过一些内置方法来进行合并: pandas.merge可根据一个或多个键 ...

  4. 利用Python进行数据分析——数据规整化:清理、转换、合并、重塑(七)(1)

    数据分析和建模方面的大量编程工作都是用在数据准备上的:载入.清理.转换以及重塑.有时候,存放在文件或数据库中的数据并不能满足你的数据处理应用的要求.很多人都选择使用通用编程语言(如Python.Per ...

  5. 【学习】数据规整化:清理、转换、合并、重塑【pandas】

    这一部分非常关键! 数据分析和建模方面的大量编程工作都是用在数据准备上的:加载.清理.转换以及重塑. 1.合并数据集 pandas对象中的数据可以通过 一些内置的方式进行合并: pandas.merg ...

  6. 【学习】数据规整化:清理、转换、合并、重塑(续)【pandas】

    @合并重叠数据 还有一种数据组合问题不能用简单的合并或连接运算来处理.比如说,你可能有索引全部或部分重叠的两个数据集 使用numpy的where函数,它用于表达一种矢量化的if - else a = ...

  7. 第三章 python数据规整化

    本章概要 1.去重 2.缺失值处理 3.清洗字符型数据的空格 4.字段抽取 去重 把数据结构中,行相同的数据只保留一行 函数语法: drop_duplicates() #导入pandas包中的read ...

  8. 《利用python进行数据分析》读书笔记--第七章 数据规整化:清理、转换、合并、重塑(三)

    http://www.cnblogs.com/batteryhp/p/5046433.html 5.示例:usda食品数据库 下面是一个具体的例子,书中最重要的就是例子. #-*- encoding: ...

  9. 数据规整化:pandas 求合并数据集(交集并集等)

    数据集的合并或连接运算是通过一个或多个键将行链接起来的.这些运算是关系型数据库的核心.pandas的merge函数是对数据应用这些算法的这样切入点. 默认是交集, inner连接 列名不同可以分别指定 ...

随机推荐

  1. Axis1.4之即时发布服务

    下载axis1.4开发包,解压开发包,将webapps目录下的axis文件夹拷贝到tomcat的webapps目录下.启动tomcat,在浏览器输入http://localhost:8080/axis ...

  2. mysql数据库索引优化与实践(一)

    前言 mysql数据库是现在应用最广泛的数据库系统.与数据库打交道是每个Java程序员日常工作之一,索引优化是必备的技能之一. 为什么要了解索引 真实案例 案例一:大学有段时间学习爬虫,爬取了知乎30 ...

  3. jquery validate 动态增加删除验证规则

    增加规则示例: $('.class').rules('add',{ required: true, messages:{ required: '这是必填,请填写', } }); 删除规则示例: $(' ...

  4. STL --> deque双向队列

    deque简介 deque是双向开口的连续性存储空间.虽说是连续性存储空间,但这种连续性只是表面上的,实际上它的内存是动态分配的,它在堆上分配了一块一块的动态储存区,每一块动态存储去本身是连续的,de ...

  5. c++ --> static关键字总结

    static关键字总结 C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static.前者应用于普通变量和函数,不涉及类:后者主要说明static在类中的作用. ...

  6. Kali Linux下安装Nessus扫描器

    一.官网下载Nessus(http://www.tenable.com/products/nessus/select-your-operating-system),这里需要查找自己对应的版本,如下图一 ...

  7. 升级 mysql5.6 配置文件my.cnf sql_mode 解析与设置问题

    sql_mode是个很容易被忽视的变量,默认值是空值,在这种设置下是可以允许一些非法操作的,比如允许一些非法数据的插入.在生产环境必须将这个值设置为严格模式,所以开发.测试环境的数据库也必须要设置,这 ...

  8. C语言中的atan和atan2

    本文内容为转载,是在阅读 RTKLIB源码时意识到的这个问题,原文地址为:https://www.cnblogs.com/dutlei/archive/2013/01/14/2860332.html ...

  9. CocoaPods 基础知识--------安装 及 使用第三方库

    极客学院:http://www.jikexueyuan.com/course/2665_2.html?ss=1

  10. 视频聊天 Demo

    ESFramework Demo -- 入门Demo,简单的即时通讯系统(附源码) 是基于ESFramework实现的一个简单的文字聊天demo,现在,我们将在这个demo的基础上,使用OMCS为其增 ...