2020-11-21

获取数据后,需要对数据进行合并,通常是日期,也有对相同公司进行合并

下面就研究数据合并的常用方法:

目录

  • append
  • merge
    • on属性
    • how属性(inner,outer,left , right)
    • indicator
  • concat
    • axis
    • join
    • ~~join_axes~~ 现已删除
    • ignore_index
    • keys
    • levels
    • sort

首先创建几个DataFrame,作为样本材料进行练习:

df1 = pd.DataFrame(np.ones((4, 4))*1, columns=list(‘DCBA’), index=list(‘4321’))
df2 = pd.DataFrame(np.ones((4, 4))*2, columns=list(‘FEDC’), index=list(‘6543’))
df3 = pd.DataFrame(np.ones((4, 4))*3, columns=list(‘FEBA’), index=list(‘6521’))

append

df1.append(df2)D	C	B	A	F	E
4	1.0	1.0	1.0	1.0	NaN	NaN
3	1.0	1.0	1.0	1.0	NaN	NaN
2	1.0	1.0	1.0	1.0	NaN	NaN
1	1.0	1.0	1.0	1.0	NaN	NaN
6	2.0	2.0	NaN	NaN	2.0	2.0
5	2.0	2.0	NaN	NaN	2.0	2.0
4	2.0	2.0	NaN	NaN	2.0	2.0
3	2.0	2.0	NaN	NaN	2.0	2.0
df1.append(df2, ignore_index=True)D	C	B	A	F	E
0	1.0	1.0	1.0	1.0	NaN	NaN
1	1.0	1.0	1.0	1.0	NaN	NaN
2	1.0	1.0	1.0	1.0	NaN	NaN
3	1.0	1.0	1.0	1.0	NaN	NaN
4	2.0	2.0	NaN	NaN	2.0	2.0
5	2.0	2.0	NaN	NaN	2.0	2.0
6	2.0	2.0	NaN	NaN	2.0	2.0
7	2.0	2.0	NaN	NaN	2.0	2.0
df1.append([df2, df3], ignore_index=True)D	C	B	A	F	E
0	1.0	1.0	1.0	1.0	NaN	NaN
1	1.0	1.0	1.0	1.0	NaN	NaN
2	1.0	1.0	1.0	1.0	NaN	NaN
3	1.0	1.0	1.0	1.0	NaN	NaN
4	2.0	2.0	NaN	NaN	2.0	2.0
5	2.0	2.0	NaN	NaN	2.0	2.0
6	2.0	2.0	NaN	NaN	2.0	2.0
7	2.0	2.0	NaN	NaN	2.0	2.0
8	NaN	NaN	3.0	3.0	3.0	3.0
9	NaN	NaN	3.0	3.0	3.0	3.0
10	NaN	NaN	3.0	3.0	3.0	3.0
11	NaN	NaN	3.0	3.0	3.0	3.0

merge

创建表格

left = pd.DataFrame({'A': ['a0', 'a1', 'a2', 'a3'],'B': ['b0', 'b1', 'b2', 'b3'],'k1': ['x', 'x', 'y', 'y']})
right = pd.DataFrame({'C': ['c1', 'c2', 'c3', 'c4'],'D': ['d1', 'd2', 'd3', 'd4'],'k1': ['y', 'y', 'z', 'z']})

合并

pd.merge(left,right)A	B	k1	C	D
0	a2	b2	y	c1	d1
1	a2	b2	y	c2	d2
2	a3	b3	y	c1	d1
3	a3	b3	y	c2	d2

只保留所有共同列都相等的行

left['k2'] = list('1234')
right['k2'] = list('5678')
d.merge(left,right)
pd.merge(left,right)
A	B	k1	k2	C	D

on属性

指定合并基准列

pd.merge(left,right,on='k1')A	B	k1	k2_x	C	D	k2_y
0	a2	b2	y	3		c1	d1	5
1	a2	b2	y	3		c2	d2	6
2	a3	b3	y	4		c1	d1	5
3	a3	b3	y	4		c2	d2	6

how属性(inner,outer,left , right)

‘inner’:共同列的值必须完全相等:

pd.merge(left, right, on='k1', how='inner')
A	B	k1	k2_x	C	D	k2_y
0	a2	b2	y	3	c1	d1	5
1	a2	b2	y	3	c2	d2	6
2	a3	b3	y	4	c1	d1	5
3	a3	b3	y	4	c2	d2	6

‘outer’:共同列的值都会保留,left或right在共同列上的差集,会对它们的缺失列项的值赋上NaN:

pd.merge(left, right, on='k1', how='outer')A	B	k1	k2_x	C	D	k2_y
0	a0	b0	x	1		NaN	NaN	NaN
1	a1	b1	x	2		NaN	NaN	NaN
2	a2	b2	y	3		c1	d1	5
3	a2	b2	y	3		c2	d2	6
4	a3	b3	y	4		c1	d1	5
5	a3	b3	y	4		c2	d2	6
6	NaN	NaN	z	NaN		c3	d3	7
7	NaN	NaN	z	NaN		c4	d4	8

‘left’:根据左边的DataFrame确定共同列的保留值,右边缺失列项的值赋上NaN:

pd.merge(left, right, on='k1', how='left')A	B	k1	k2_x	C	D	k2_y
0	a0	b0	x	1	NaN	NaN	NaN
1	a1	b1	x	2	NaN	NaN	NaN
2	a2	b2	y	3	c1	d1	5
3	a2	b2	y	3	c2	d2	6
4	a3	b3	y	4	c1	d1	5
5	a3	b3	y	4	c2	d2	6

‘right’:根据右边的DataFrame确定共同列的保留值,左边缺失列项的值赋上NaN:

pd.merge(left, right, on='k1', how='right')A	B	k1	k2_x	C	D	k2_y
0	a2	b2	y	3		c1	d1	5
1	a3	b3	y	4		c1	d1	5
2	a2	b2	y	3		c2	d2	6
3	a3	b3	y	4		c2	d2	6
4	NaN	NaN	z	NaN		c3	d3	7
5	NaN	NaN	z	NaN		c4	d4	8

indicator

设置True表示显示合并方式,即left / right / both:

pd.merge(left, right, on='k1', how='outer', indicator=True)
A	B	k1	k2_x	C	D	k2_y	_merge
0	a0	b0	x	1	NaN	NaN	NaN	left_only
1	a1	b1	x	2	NaN	NaN	NaN	left_only
2	a2	b2	y	3	c1	d1	5	both
3	a2	b2	y	3	c2	d2	6	both
4	a3	b3	y	4	c1	d1	5	both
5	a3	b3	y	4	c2	d2	6	both
6	NaN	NaN	z	NaN	c3	d3	7	right_only
7	NaN	NaN	z	NaN	c4	d4	8	right_only

concat

pd.concat([df1, df2])D	C	B	A	F	E
4	1.0	1.0	1.0	1.0	NaN	NaN
3	1.0	1.0	1.0	1.0	NaN	NaN
2	1.0	1.0	1.0	1.0	NaN	NaN
1	1.0	1.0	1.0	1.0	NaN	NaN
6	2.0	2.0	NaN	NaN	2.0	2.0
5	2.0	2.0	NaN	NaN	2.0	2.0
4	2.0	2.0	NaN	NaN	2.0	2.0
3	2.0	2.0	NaN	NaN	2.0	2.0

axis

axis=0:竖方向(index)合并,合并方向index作列表相加,非合并方向columns取并集

pd.concat([df1, df2], axis=0)D	C	B	A	F	E
4	1.0	1.0	1.0	1.0	NaN	NaN
3	1.0	1.0	1.0	1.0	NaN	NaN
2	1.0	1.0	1.0	1.0	NaN	NaN
1	1.0	1.0	1.0	1.0	NaN	NaN
6	2.0	2.0	NaN	NaN	2.0	2.0
5	2.0	2.0	NaN	NaN	2.0	2.0
4	2.0	2.0	NaN	NaN	2.0	2.0
3	2.0	2.0	NaN	NaN	2.0	2.0

axis=1:横方向(columns)合并,合并方向columns作列表相加,非合并方向index取并集

pd.concat([df1, df2], axis=1)D	C	B	A	F	E	D	C
4	1.0	1.0	1.0	1.0	2.0	2.0	2.0	2.0
3	1.0	1.0	1.0	1.0	2.0	2.0	2.0	2.0
2	1.0	1.0	1.0	1.0	NaN	NaN	NaN	NaN
1	1.0	1.0	1.0	1.0	NaN	NaN	NaN	NaN
6	NaN	NaN	NaN	NaN	2.0	2.0	2.0	2.0
5	NaN	NaN	NaN	NaN	2.0	2.0	2.0	2.0

join

inner取交集(inner)

pd.concat([df1, df2], axis=0, join='inner')D	C
4	1.0	1.0
3	1.0	1.0
2	1.0	1.0
1	1.0	1.0
6	2.0	2.0
5	2.0	2.0
4	2.0	2.0
3	2.0	2.0

outer 取并集(outer)

pd.concat([df1, df2], axis=0, join='outer')D	C	B	A	F	E
4	1.0	1.0	1.0	1.0	NaN	NaN
3	1.0	1.0	1.0	1.0	NaN	NaN
2	1.0	1.0	1.0	1.0	NaN	NaN
1	1.0	1.0	1.0	1.0	NaN	NaN
6	2.0	2.0	NaN	NaN	2.0	2.0
5	2.0	2.0	NaN	NaN	2.0	2.0
4	2.0	2.0	NaN	NaN	2.0	2.0
3	2.0	2.0	NaN	NaN	2.0	2.0

join_axes 现已删除

合并后,可以设置非合并方向的行/列名称,使用某个df的行/列名称
join_axes=[df1.columns],合并后columns使用df1的

 pd.concat([df1, df2], axis=0, join_axes=[df1.columns])D    C    B    A
4  1.0  1.0  1.0  1.0
3  1.0  1.0  1.0  1.0
2  1.0  1.0  1.0  1.0
1  1.0  1.0  1.0  1.0
6  2.0  2.0  NaN  NaN
5  2.0  2.0  NaN  NaN
4  2.0  2.0  NaN  NaN
3  2.0  2.0  NaN  NaN

axes=[df1.index],合并后index使用df2的:

pd.concat([df1, df2], axis=1, join_axes=[df1.index])D    C    B    A    F    E    D    C
4  1.0  1.0  1.0  1.0  2.0  2.0  2.0  2.0
3  1.0  1.0  1.0  1.0  2.0  2.0  2.0  2.0
2  1.0  1.0  1.0  1.0  NaN  NaN  NaN  NaN
1  1.0  1.0  1.0  1.0  NaN  NaN  NaN  NaN

ignore_index

合并方向是否忽略原行/列名称,而采用系统默认的索引,即从0开始的int。
axis=0时ignore_index=True,index采用系统默认索引:

pd.concat([df1, df2], axis=0, ignore_index=True)D	C	B	A	F	E
0	1.0	1.0	1.0	1.0	NaN	NaN
1	1.0	1.0	1.0	1.0	NaN	NaN
2	1.0	1.0	1.0	1.0	NaN	NaN
3	1.0	1.0	1.0	1.0	NaN	NaN
4	2.0	2.0	NaN	NaN	2.0	2.0
5	2.0	2.0	NaN	NaN	2.0	2.0
6	2.0	2.0	NaN	NaN	2.0	2.0
7	2.0	2.0	NaN	NaN	2.0	2.

axis=1时ignore_index=True,columns采用系统默认索引:

pd.concat([df1, df2], axis=1, ignore_index=True)0    1    2    3    4    5    6    7
1  1.0  1.0  1.0  1.0  NaN  NaN  NaN  NaN
2  1.0  1.0  1.0  1.0  NaN  NaN  NaN  NaN
3  1.0  1.0  1.0  1.0  2.0  2.0  2.0  2.0
4  1.0  1.0  1.0  1.0  2.0  2.0  2.0  2.0
5  NaN  NaN  NaN  NaN  2.0  2.0  2.0  2.0
6  NaN  NaN  NaN  NaN  2.0  2.0  2.0  2.0

keys

可以加一层标签,标识行/列名称属于原来哪个df。
axis=0时设置keys:

pd.concat([df1, df2],  axis=0, keys=['df1', 'df2'])D	C	B	A	F	E
df1	4	1.0	1.0	1.0	1.0	NaN	NaN3	1.0	1.0	1.0	1.0	NaN	NaN2	1.0	1.0	1.0	1.0	NaN	NaN1	1.0	1.0	1.0	1.0	NaN	NaN
df2	6	2.0	2.0	NaN	NaN	2.0	2.05	2.0	2.0	NaN	NaN	2.0	2.04	2.0	2.0	NaN	NaN	2.0	2.03	2.0	2.0	NaN	NaN	2.0	2.0

axis=1时设置keys:

pd.concat([df1, df2],  axis=1, keys=['df1', 'df2'])df1				df2D	C	B	A	F	E	D	C
4	1.0	1.0	1.0	1.0	2.0	2.0	2.0	2.0
3	1.0	1.0	1.0	1.0	2.0	2.0	2.0	2.0
2	1.0	1.0	1.0	1.0	NaN	NaN	NaN	NaN
1	1.0	1.0	1.0	1.0	NaN	NaN	NaN	NaN
6	NaN	NaN	NaN	NaN	2.0	2.0	2.0	2.0
5	NaN	NaN	NaN	NaN	2.0	2.0	2.0	2.0 

levels

明确行/列名称取值范围:

df = pd.concat([df1, df2], axis=0, keys=['df1', 'df2'], levels=[['df1', 'df2', 'df3', 'df4']])
df.index.levels
FrozenList([['df1', 'df2', 'df3', 'df4'], ['1', '2', '3', '4', '5', '6']])

sort

对列名排序

pd.concat([df1, df2], axis=0, sort=True)A	B	C	D	E	F
4	1.0	1.0	1.0	1.0	NaN	NaN
3	1.0	1.0	1.0	1.0	NaN	NaN
2	1.0	1.0	1.0	1.0	NaN	NaN
1	1.0	1.0	1.0	1.0	NaN	NaN
6	NaN	NaN	2.0	2.0	2.0	2.0
5	NaN	NaN	2.0	2.0	2.0	2.0
4	NaN	NaN	2.0	2.0	2.0	2.0
3	NaN	NaN	2.0	2.0	2.0	2.0

对行名排序

pd.concat([df1, df2], axis=1, sort=True)D	C	B	A	F	E	D	C
1	1.0	1.0	1.0	1.0	NaN	NaN	NaN	NaN
2	1.0	1.0	1.0	1.0	NaN	NaN	NaN	NaN
3	1.0	1.0	1.0	1.0	2.0	2.0	2.0	2.0
4	1.0	1.0	1.0	1.0	2.0	2.0	2.0	2.0
5	NaN	NaN	NaN	NaN	2.0	2.0	2.0	2.0
6	NaN	NaN	NaN	NaN	2.0	2.0	2.0	2.0

DataFrame根据行列名称排序
行名称排序

aa.sort_index(axis=0)A	B	C	D	E	F
1	1.0	1.0	1.0	1.0	NaN	NaN
2	1.0	1.0	1.0	1.0	NaN	NaN
3	1.0	1.0	1.0	1.0	NaN	NaN
3	NaN	NaN	2.0	2.0	2.0	2.0
4	1.0	1.0	1.0	1.0	NaN	NaN
4	NaN	NaN	2.0	2.0	2.0	2.0
5	NaN	NaN	2.0	2.0	2.0	2.0
6	NaN	NaN	2.0	2.0	2.0	2.0

列名称排序

aa.sort_index(axis=1)A	B	C	C	D	D	E	F
1	1.0	1.0	1.0	NaN	1.0	NaN	NaN	NaN
2	1.0	1.0	1.0	NaN	1.0	NaN	NaN	NaN
3	1.0	1.0	1.0	2.0	1.0	2.0	2.0	2.0
4	1.0	1.0	1.0	2.0	1.0	2.0	2.0	2.0
5	NaN	NaN	NaN	2.0	NaN	2.0	2.0	2.0
6	NaN	NaN	NaN	2.0	NaN	2.0	2.0	2.0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/449841.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

走技术线,还是技术管理线?

最近因为要给刚毕业的学生做一次演讲,所以就职业发展这类话题先以写博客的形式做一些思考,希望届时能给同学们带来质量更高的内容。我在《驾驭你的“职场布朗运动”》一文中谈了25条职场感悟并提出了“走技术线,还是技术管理线?”…

[Nikon D80]樱花盛开的校园

花开花落,阳春三月,随身背着相机在学校里游走,不断的寻找视角。知道自己拍的不好,总觉得自己拍的片有各式各样的缺陷,也许这就是大师与学徒的区别吧。用好手头的装备,出好片,锻炼Visual Effect …

「LG2664 树上游戏」

题目 这真是一道神仙的一批的题目 定义\(s(i,j)\)表示从点\(i\)到点\(j\)经过的颜色数量 设 \[sum_i\sum_{j1}^ns(i,j)\] 求出所有的\(sum_i\) 考虑点分治 对于一个点我们用两种方式来统计其答案 这个点作为分治重心时,分值区域内所有点到这个点贡献这个点不是分治重…

DUBBO 使用问题记录

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 官方ISSUE参考 https://github.com/alibaba/dubbo/issues 注册中心ZookeeperRegistry.doSaveProperties warn 2014-10-1419:56:51WARN …

真格量化学习处理——几个功能小函数

真格这周是学习使用了不少,功能算是很不错,但在做的时候也发现了一个问题: 数据缺失:我在做回测,要求获取每天的delta值,并从中筛选条件值时,报错,显示无数据。不得不使用pass,影响我的回测连贯性。 现在开始讲下,我做的几个功能函数: 算起来,挺烦的,就是各种细节…

软件技术发展的驱动力

软件产品的终极目标是为了实现用户需求从而满足人们的需要。也正是为了不断满足人们的需要使得软件行业不断向前发展。比如,新的算法(MPEG-1、MPEG-2、MPEG-4、H.264、……)等的出现都在当时为了满足不同的需要而被发明。然而,人们…

The Model Driven Software Network

国外的一个模型驱动软件开发的讨论社区,The Model Driven Software Network这个社区讨论的都是模型驱动开发相关的话题,虽然建立不久,但加入的人越来越多,建立群组的是Mark Dalgarno以下是一些讨论: Textual v Graphical models W…

无敌简单快速的文件服务器sgfs

前言 想要构建一个Linux文件服务器?看看下面几个要求是不是你想要的? 1、只需要单节点部署就够了 2、部署启动简单,下载之后,一键启动,一键关闭 3、不需要任何其他的依赖安装,而且运行时占用内存资源少 4、…

springboot多数据源配置

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 之前在介绍使用JdbcTemplate和Spring-data-jpa时,都使用了单数据源。在单数据源的情况下,Spring Boot的配置非常…

pyhon量化数据处理小细节3---日期格式转换

不同的数据文档,会获得不同日期格式,常见的有str(20200101),datetime(20200101),又或者是2020-01-01,,2020-1-1,20-1-1,20-Apr_20th,2020/01/01,20/01/01等等,总之类型很多。因此需要我们对日期格式进行统一化。这里我…

面向对象和基于对象

面向对象大家都很熟悉,可是基于对象就不一定了。两个听起来好象是同一回事,而事实上它们却千差万别。基于对象是指:我们采用对象封装技术,将数据和操作捆绑在一起,但是并没有合理地使用多态、继承等面向对象技术进行软…

CSS margin 属性简介

CSS margin 属性 设置外边距的最简单的方法就是使用 margin 属性。 margin 属性接受任何长度单位,可以是像素、英寸、毫米或 em。 margin 可以设置为 auto。更常见的做法是为外边距设置长度值。下面的声明在 h1 元素的各个边上设置了 1/4 英寸宽的空白:h…

MVC中使用代码创建数据库(code first +mysql+EF)

1.新建一个mvc项目 2.安装mysql需要的几个文件 EntityFramework、MySql.Data(6.9.12)和MySql.Data.Entity (6.9.12) 这里有几点要注意 1.MySql.Data和MySql.Data.Entity 版本必须一致 2.我试用了6.10的版本 要报错 3.我测试没有问…

github 学习使用

博主第一次使用github,所以会将过程全成描述欢迎使用Github注册安装进入仓库,创建、修改、上传文件。强制推送强制覆盖上传文件欢迎使用Github 注册 直接进入github官网:https://github.com 点击sigh up 进行注册 直接填写即可然后验证通过…

Java中9大内置基本数据类型Class实例和数组的Class实例

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1、Java中9大内置几本数据类型: 对于对象来说,可以直接使用对象.getClass()或者Class.forName(className);、类名.class都可以…

软件质量管理之困境与对策思考

相信在不少与软件开发相关的企业内,质量管理部门与软件开发部门在日常运作中形成了如下图所示的“哑铃形”组织结构。 开发部门执行质量管理部门所制定的流程,通过提供证据的形式将各种流程执行后的数据反馈给质量管理部门(包括缺陷率和各种流…

GDI+用PNG图片做半透明异型窗口

{*******************************************************}{ }{ GDI用PNG图片做半透明异型窗口 }{ }{ 版权所有 (C) 2008 QQ:…

java Spring Boot中使用Swagger2构建API文档

1、添加Swagger2的依赖 在pom.xml中加入Swagger2的依赖 <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.2.2</version> </dependency> <dependency><groupId&g…

什么是 FreeMarker

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 转自官方文档&#xff0c;只是记录下官方在线手册地址&#xff1a;http://freemarker.foofun.cn/ FreeMarker 是一款 模板引擎&#xff…

TP函数

U方法用于完成对URL地址的组装&#xff0c;特点在于可以自动根据当前的URL模式和设置生成对应的URL地址&#xff0c;格式为&#xff1a;U(地址,参数,伪静态,是否跳转,显示域名);在模板中使用U方法而不是固定写死URL地址的好处在于&#xff0c;一旦你的环境变化或者参数设置改变…