python merge、concat合并数据集
数据规整化:合并、清理、过滤
pandas和python标准库提供了一整套高级、灵活的、高效的核心函数和算法将数据规整化为你想要的形式!
本篇博客主要介绍:
合并数据集:.merge()、.concat()等方法,类似于SQL或其他关系型数据库的连接操作。
合并数据集
1) merge 函数
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)
参数 说明
left 参与合并的左侧DataFrame
right 参与合并的右侧DataFrame
how 连接方式:‘inner’(默认)#交集;还有,‘outer’(并集)、‘left’(左全部,右部分)、‘right’(右全部,左部分)
on 用于连接的列名,必须同时存在于左右两个DataFrame对象中,如果位指定,则以left和right列名的交集作为连接键
left_on 左侧DataFarme中用作连接键的列
right_on 右侧DataFarme中用作连接键的列
left_index 将左侧的行索引用作其连接键
right_index 将右侧的行索引用作其连接键
sort 根据连接键对合并后的数据进行排序,默认为True。有时在处理大数据集时,禁用该选项可获得更好的性能
suffixes 字符串值元组,用于追加到重叠列名的末尾,默认为(‘_x’,‘_y’).例如,左右两个DataFrame对象都有‘data’,则结果中就会出现‘data_x’,‘data_y’
copy 设置为False,可以在某些特殊情况下避免将数据复制到结果数据结构中。默认总是赋值
例子:
df = pd.DataFrame({"id":[1001,1002,1003,1004,1005,1006],
"date":pd.date_range('20130102', periods=6),
"city":['Beijing ', 'SH', 'guangzhou ', 'Shenzhen', 'shanghai', 'BEIJING '],
"age":[23,44,54,32,34,32],
"category":['100-A','100-B','110-A','110-C','210-A','130-F'],
"price":[1200,np.nan,2133,5433,np.nan,4432]},
columns =['id','date','city','category','age','price']) df
Out[46]:
id date city category age price
0 1001 2013-01-02 Beijing 100-A 23 1200.0
1 1002 2013-01-03 SH 100-B 44 NaN
2 1003 2013-01-04 guangzhou 110-A 54 2133.0
3 1004 2013-01-05 Shenzhen 110-C 32 5433.0
4 1005 2013-01-06 shanghai 210-A 34 NaN
5 1006 2013-01-07 BEIJING 130-F 32 4432.0 df1=pd.DataFrame({"acct_no":[1001,1002,1003,1004,1005,1006,1007,1008],
"gender":['male','female','male','female','male','female','male','female'],
"pay":['Y','N','Y','Y','N','Y','N','Y',],
"m-point":[10,12,20,40,40,40,30,20]}) df1
Out[48]:
acct_no gender pay m-point
0 1001 male Y 10
1 1002 female N 12
2 1003 male Y 20
3 1004 female Y 40
4 1005 male N 40
5 1006 female Y 40
6 1007 male N 30
7 1008 female Y 20 data1 = pd.merge(df,df1,left_on="id",right_on="acct_no") data1
Out[50]:
id date city category ... acct_no gender pay m-point
0 1001 2013-01-02 Beijing 100-A ... 1001 male Y 10
1 1002 2013-01-03 SH 100-B ... 1002 female N 12
2 1003 2013-01-04 guangzhou 110-A ... 1003 male Y 20
3 1004 2013-01-05 Shenzhen 110-C ... 1004 female Y 40
4 1005 2013-01-06 shanghai 210-A ... 1005 male N 40
5 1006 2013-01-07 BEIJING 130-F ... 1006 female Y 40 [6 rows x 10 columns]
2)concat函数
在这里展示一种新的连接方法,对应于numpy的concatenate函数,pandas有concat函数
concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, sort=None, copy=True)
参数 说明
objs 参与连接的列表或字典,且列表或字典里的对象是pandas数据类型,唯一必须给定的参数
axis=0 指明连接的轴向,0是纵轴,1是横轴,默认是0
join 指明轴向索引的索引是交集还是并集:‘inner’(交集),‘outer’(并集),默认是‘outer’
join_axis 指明用于其他n-1条轴的索引(层次化索引,某个轴向有多个索引),不执行交并集
keys 与连接对象有关的值,用于形成连接轴向上的层次化索引(外层索引),可以是任意值的列表或数组、元组数据、数组列表(如果将levels设置成多级数组的话)
levels 指定用作层次化索引各级别(内层索引)上的索引,如果设置keys的话
names 用于创建分层级别的名称,如果设置keys或levels的话
verify_integrity 检查结果对象新轴上的重复情况,如果发横则引发异常,默认False,允许重复
ignore_index 不保留连接轴上的索引,产生一组新索引range(total_length)
例子:
pd.concat([df,df1])#默认并集、纵向连接
Out[57]:
acct_no age category city ... id m-point pay price
0 NaN 23.0 100-A Beijing ... 1001.0 NaN NaN 1200.0
1 NaN 44.0 100-B SH ... 1002.0 NaN NaN NaN
2 NaN 54.0 110-A guangzhou ... 1003.0 NaN NaN 2133.0
3 NaN 32.0 110-C Shenzhen ... 1004.0 NaN NaN 5433.0
4 NaN 34.0 210-A shanghai ... 1005.0 NaN NaN NaN
5 NaN 32.0 130-F BEIJING ... 1006.0 NaN NaN 4432.0
0 1001.0 NaN NaN NaN ... NaN 10.0 Y NaN
1 1002.0 NaN NaN NaN ... NaN 12.0 N NaN
2 1003.0 NaN NaN NaN ... NaN 20.0 Y NaN
3 1004.0 NaN NaN NaN ... NaN 40.0 Y NaN
4 1005.0 NaN NaN NaN ... NaN 40.0 N NaN
5 1006.0 NaN NaN NaN ... NaN 40.0 Y NaN
6 1007.0 NaN NaN NaN ... NaN 30.0 N NaN
7 1008.0 NaN NaN NaN ... NaN 20.0 Y NaN [14 rows x 10 columns] pd.concat([df,df1],ignore_index = True)#生成纵轴上的并集,索引会自动生成新的一列
Out[58]:
acct_no age category city ... id m-point pay price
0 NaN 23.0 100-A Beijing ... 1001.0 NaN NaN 1200.0
1 NaN 44.0 100-B SH ... 1002.0 NaN NaN NaN
2 NaN 54.0 110-A guangzhou ... 1003.0 NaN NaN 2133.0
3 NaN 32.0 110-C Shenzhen ... 1004.0 NaN NaN 5433.0
4 NaN 34.0 210-A shanghai ... 1005.0 NaN NaN NaN
5 NaN 32.0 130-F BEIJING ... 1006.0 NaN NaN 4432.0
6 1001.0 NaN NaN NaN ... NaN 10.0 Y NaN
7 1002.0 NaN NaN NaN ... NaN 12.0 N NaN
8 1003.0 NaN NaN NaN ... NaN 20.0 Y NaN
9 1004.0 NaN NaN NaN ... NaN 40.0 Y NaN
10 1005.0 NaN NaN NaN ... NaN 40.0 N NaN
11 1006.0 NaN NaN NaN ... NaN 40.0 Y NaN
12 1007.0 NaN NaN NaN ... NaN 30.0 N NaN
13 1008.0 NaN NaN NaN ... NaN 20.0 Y NaN [14 rows x 10 columns] pd.concat([df,df1],axis = 1,join = 'inner')#横向取交集,注意该方法对对象表中有重复索引时失效
Out[59]:
id date city category ... acct_no gender pay m-point
0 1001 2013-01-02 Beijing 100-A ... 1001 male Y 10
1 1002 2013-01-03 SH 100-B ... 1002 female N 12
2 1003 2013-01-04 guangzhou 110-A ... 1003 male Y 20
3 1004 2013-01-05 Shenzhen 110-C ... 1004 female Y 40
4 1005 2013-01-06 shanghai 210-A ... 1005 male N 40
5 1006 2013-01-07 BEIJING 130-F ... 1006 female Y 40 [6 rows x 10 columns] pd.concat([df,df1],axis = 1,join = 'outer')#横向取并集,注意该方法对对象表中有重复索引时失效
Out[60]:
id date city category ... acct_no gender pay m-point
0 1001.0 2013-01-02 Beijing 100-A ... 1001 male Y 10
1 1002.0 2013-01-03 SH 100-B ... 1002 female N 12
2 1003.0 2013-01-04 guangzhou 110-A ... 1003 male Y 20
3 1004.0 2013-01-05 Shenzhen 110-C ... 1004 female Y 40
4 1005.0 2013-01-06 shanghai 210-A ... 1005 male N 40
5 1006.0 2013-01-07 BEIJING 130-F ... 1006 female Y 40
6 NaN NaT NaN NaN ... 1007 male N 30
7 NaN NaT NaN NaN ... 1008 female Y 20 [8 rows x 10 columns]
3)combine_first函数(含有重叠索引的缺失值填补)
#全部索引重叠
a = pd.Series([np.nan,2.5,np.nan,3.5,4.5,np.nan],index = ['a','b','c','d','e','f'])
a
Out[62]:
a NaN
b 2.5
c NaN
d 3.5
e 4.5
f NaN
dtype: float64 b = pd.Series(np.arange(len(a)),index = ['a','b','c','d','e','f'])
b
Out[64]:
a 0
b 1
c 2
d 3
e 4
f 5
dtype: int32 a.combine_first(b)#利用b填补了a的空值
Out[65]:
a 0.0
b 2.5
c 2.0
d 3.5
e 4.5
f 5.0
dtype: float64
#部分索引重叠
a = pd.Series([np.nan,2.5,np.nan,3.5,4.5,np.nan],index = ['g','b','c','d','e','f'])
a
Out[67]:
g NaN
b 2.5
c NaN
d 3.5
e 4.5
f NaN
dtype: float64 a.combine_first(b)#部分索引重叠
Out[68]:
a 0.0
b 2.5
c 2.0
d 3.5
e 4.5
f 5.0
g NaN
dtype: float64
python merge、concat合并数据集的更多相关文章
- Pandas合并数据集之merge、join方法
合并数据集 pandas.merge 可根据一个或多个键将不同DataFrame中的行连接起来. pandas.concat 可以沿着一条轴将多个对象堆叠到一起. combine_first merg ...
- dataframe 合并(append, merge, concat)
https://www.cnblogs.com/guxh/p/9451532.html https://blog.csdn.net/zutsoft/article/details/51498026 写 ...
- SQL 提示介绍 hash/merge/concat union
查询提示一直是个很有争议的东西,因为他影响了sql server 自己选择执行计划.很多人在问是否应该使用查询提示的时候一般会被告知慎用或不要使用...但是个人认为善用提示在不修改语句的条件下,是常用 ...
- 合并多个python list以及合并多个 django QuerySet 的方法
在用python或者django写一些小工具应用的时候,有可能会遇到合并多个list到一个 list 的情况.单纯从技术角度来说,处理起来没什么难度,能想到的办法很多,但我觉得有一个很简单而且效率比较 ...
- C++ Opencv split()通道分离函数 merge()通道合并函数 使用操作详解
一. split()通道分离函数 split()函数的C++版本有两个原型,他们分别是: C++: void split(const Mat& src, Mat*mvbegin);//& ...
- 【转载】C#的Merge方法合并两个DataTable对象的数据
在C#中的Datatable类中,可以使用DataTable类的Merge方法对两个相同结构的DataTable对象进行求并集运算,将两个DataTable对象的数据行合并到其中一个DataTable ...
- -Gradle 翻译 Merge AndroidManifest 合并清单文件 MD
目录 目录 Merge AndroidManifest 合并清单文件 合并多个清单文件 合并优先级 合并冲突启发式算法 合并规则的标记 节点标记 属性标记 Attribute markers 标记选择 ...
- Python win32com模块 合并文件夹内多个docx文件为一个docx
Python win32com模块 合并文件夹内多个docx文件为一个docx #!/usr/bin/env python # -*- coding: utf-8 -*- from win32com. ...
- svn 版本管理,trunk(主干),branch(分支),merge(合并)
svn 版本管理,主要对trunk(主干).branch(分支).merge(合并)进行说明. svn作为一个常用的版本管理工具,一些基本操作必须要会,在这里整理一下自己使用svn的一些体会: svn ...
随机推荐
- Java面向对象-构造方法,this关键字
Java面向对象-构造方法,this关键字 构造方法 概念:构造方法是一个特殊的方法,这个特殊方法用于创建实例时执行初始化操作: 上代码: package com.java1234.chap03.se ...
- linux信号量使用
#include <pthread.h> #include <semaphore.h> #include <unistd.h> #include <stdio ...
- 手机自带输入法emoji表情的输入,提交及显示——前端解决方案
体验更优排版请移步原文:http://blog.kwin.wang/programming/emoji-transform-commit.html 之前就遇到过需要前端支持用户输入并提交emoji表情 ...
- wordpress 学习笔记
(1) __()函数 function __( $text, $domain = 'default' ) { return translate( $text, $domain ); } 返回一个字符串 ...
- 后台运行python程序 遇到缓冲区问题
From: http://www.iteye.com/topic/867446 环境:linux 一段执行时间很长的程序(用python做hive客户端执行mapreduce) 在linux后台执行, ...
- 构造IOCTL命令的学习心得-----_IO,…
在编写ioctl代码之前,需要选择对应不同命令的编号.为了防止对错误的设备使用正确的命令,命令号应该在系统范围内唯一,这种错误匹配并不是不会发生,程序可能发现自己正在试图对FIFO和audio等这类非 ...
- linux驱动模块编译(初学者)
inux 模块编译步骤(转) 本文将直接了当的带你进入linux的模块编译.当然在介绍的过程当中,我也会添加一些必要的注释,以便初学者能够看懂.之所以要写这篇文章,主要是因为从书本上学的话,可能要花更 ...
- linux的基本指令--第三节
查找与检索: 一.文件名查找:find . -name "test*" find 路径 查找类型 名字 未输入路径则默认当前路径 二 . 内容检索:grep &q ...
- Spring总结二:IOC(控制反转)xml方式
1,简介: IoC :Inverse of control 控制反转 ,思想就是在项目中引入一个工厂容器,对项目中接口依赖对象的创建,实现项目中对于依赖对象解耦合. 将程序中对象的创建权以及对象的整个 ...
- 用rand5()生成rand(n)
问题:有函数rand5(),它能够等概率生成[0,5)之间的整数.由rand5()构造rand(n)使其能够等概率生成[0,n)之间的整数. 思路1:有rand5()先生成等概率生成0和1的rand0 ...