基于pandas DF的数据规整:清理,转化,合并,重塑。

大多时候存放在数据库中的原始表格数据不能满足某次数据处理的要求;或者你需要更改原始的数据表现形式,都需要进行数据的整理。

合并数据集(DF表格  merge, concat...)

  • merge

pandas.merge:根据一个或多个不同的键将不同的DataFrame中的行连接起来(沿y轴续表)。

情形一

理解:pd.merge(df1,df2,on='key')  # 多对一的情况默认参数how='inner'就是取两个表元素的交集: 以表2的单变量b为例,对应表一的三个变量,会产生新的三个变量b;它们会从表2取出表1中没有的字段,复制到表1上去;作为结果输出 。

df1 = pd.DataFrame({"key":['b','b','a','c','a','a','b'],'data1':range(7)})
df2 = pd.DataFrame({"key":['a','b','d'],'data2':range(3)})
df1                                             # 在指定列 key 变量名不唯一
Out[6]: key  data1
0   b      0
1   b      1
2   a      2
3   c      3
4   a      4
5   a      5
6   b      6
df2                                            # 在指定列 key上面 唯一变量名
Out[7]: key  data2
0   a      0
1   b      1
2   d      2pd.merge(df1,df2)
Out[8]:                                        # 合并的时候在默认以重叠的列名当作key# 但最好用 参数 on="key" 显示指定key  data1  data2
0   b      0      1
1   b      1      1                # 最后的key 取 两个表 key变量 的交集;不进行去重
2   b      6      1
3   a      2      0
4   a      4      0
5   a      5      0

情形二:两个表的列名不同(注意仅仅是列名不同,列的变量名取值范围是一致的,只不过多少的问题,因为一般都是指定取交集,所以最好是一致的元素构成。)on= 这个参数就变成了 left_on=    +    right_on

df1 = pd.DataFrame({"lkey":['b','b','a','c','a','a','b'],'data1':range(7)})
df2 = pd.DataFrame({"rkey":['a','b','d'],'data2':range(3)})#############################################################df1
Out[12]: lkey  data1
0    b      0
1    b      1
2    a      2
3    c      3
4    a      4
5    a      5
6    b      6
df2
Out[13]: rkey  data2
0    a      0
1    b      1
2    d      2pd.merge(df1,df2,left_on='lkey',right_on='rkey')
Out[11]: lkey  data1 rkey  data2
0    b      0    b      1
1    b      1    b      1
2    b      6    b      1
3    a      2    a      0
4    a      4    a      0
5    a      5    a      0
  • 谈谈how这个参数;在 merge操作当中,how="inner",how='outer',how='left',how='right'分别表示:交集,并集,交集+保留左边,交集+保留右边。

情形三:多对多的合并,做笛卡尔积(表1有2个b;表2有3个b;结果有  2x3 = 6个b)

df1 = pd.DataFrame({"key":['b','b','a','c','a','b'],'data1':range(6)})
df2 = pd.DataFrame({"key":['a','b','a','b','d'],'data2':range(5)})##################################################################df1
Out[18]: key  data1
0   b      0
1   b      1
2   a      2
3   c      3
4   a      4
5   b      5
df2
Out[19]: key  data2
0   a      0
1   b      1
2   a      2
3   b      3
4   d      4pd.merge(df1,df2)
Out[20]: key  data1  data2
0   b      0      1
1   b      0      3
2   b      1      1
3   b      1      3
4   b      5      1
5   b      5      3
6   a      2      0
7   a      2      2
8   a      4      0
9   a      4      2

情形四:根据多个键合并;key=["key1",  "key2"]

right=pd.DataFrame({'key1':['foo','foo','bar','bar'],'key2':["one",'one','one',"two"],"rval":[4,5,6,7]})
left=pd.DataFrame({'key1':['foo','foo','bar'],'key2':["one","two","one"],"lval":[1,2,3]})#################################################################left
Out[25]: key1 key2  lval
0  foo  one     1
1  foo  two     2
2  bar  one     3
right
Out[26]: key1 key2  rval
0  foo  one     4
1  foo  one     5
2  bar  one     6
3  bar  two     7
pd.merge(left,right,on=["key1","key2"],how="outer")
Out[27]: key1 key2  lval  rval
0  foo  one   1.0   4.0
1  foo  one   1.0   5.0
2  foo  two   2.0   NaN
3  bar  one   3.0   6.0
4  bar  two   NaN   7.0

我的理解就是:现在的key1 key2 看成是一个 key;在如常做合并。

情形五:按索引合并  (重点)

传入:left_index=True

left1 = pd.DataFrame({'key':['a','b','a','a','b','c'],'value':range(6)})
right1 = pd.DataFrame({'group_val':[3.5,7]},index=['a','b'])####################################################################left1
Out[32]: key  value
0   a      0
1   b      1
2   a      2
3   a      3
4   b      4
5   c      5
right1
Out[33]: group_val
a        3.5
b        7.0pd.merge(left1,right1,left_on='key',right_index=True)
Out[34]: 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

还是遵循,在相同的变量下的笛卡尔积的原则,默认取交集:另外用索引作为key的时候,新生成的索引将用数字取代。

假设,两个表都取索引,意味着key变量名 不可能会有重复,这时候,在id 相同时,会增加 表2 的字段 给 表1 作为结果输出。

  • concat

情形一:对于无重叠索引的多个 series结构(这里指的五重叠是series之间,series内部索引本不该重叠)

s1=pd.Series([0,1],index=['a','b'])
s2=pd.Series([2,3,4],index=['c','d','e'])
s3=pd.Series([5,6],index=['f','g'])##################################################s1
Out[42]:
a    0
b    1
dtype: int64
s2
Out[43]:
c    2
d    3
e    4
dtype: int64
s3
Out[44]:
f    5
g    6
dtype: int64
pd.concat([s1,s2,s3])
Out[45]:
a    0
b    1
c    2
d    3
e    4
f    5
g    6
dtype: int64

参数:axis=1 做横向合并(横向合并的时候,索引依此排开,列之间做并集)

pd.concat([s1,s2,s3],axis=1)Out[46]: 0    1    2
a  0.0  NaN  NaN
b  1.0  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

join_axes参数:

join_axes=[df1.index], 保留与df1的行标签一样的数据,配合axis=1一起用
join_axes=[df1.columns],保留与df1的列标签一样的数据,不要添加axis=1
df1 = pd.DataFrame({"key":['b','b','a','c','a','b'],'data1':range(6)})
df2 = pd.DataFrame({"key":['a','b','a','b','d'],'data2':range(5)})##################################################################df1
Out[53]: key  data1
0   b      0
1   b      1
2   a      2
3   c      3
4   a      4
5   b      5
df2
Out[54]: key  data2
0   a      0
1   b      1
2   a      2
3   b      3
4   d      4
pd.concat([df1,df2],axis=1)  # 以二者的索引对齐,列标签直接叠加,哪怕是重复的也加
Out[55]: key  data1  key  data2
0   b      0    a    0.0
1   b      1    b    1.0
2   a      2    a    2.0
3   c      3    b    3.0
4   a      4    d    4.0
5   b      5  NaN    NaNpd.concat([df1,df2],axis=1,join_axes=[df1.index])
Out[66]: key  data1  key  data2
0   b      0    a    0.0
1   b      1    b    1.0
2   a      2    a    2.0
3   c      3    b    3.0
4   a      4    d    4.0
5   b      5  NaN    NaN
pd.concat([df1,df2],axis=1,join_axes=[df2.index])
Out[67]: key  data1 key  data2
0   b      0   a      0
1   b      1   b      1
  • 参数 key 的作用(给合并的大表格中原来的三个分表格加一个索引,一边区分和快速查询分离)

附:concat函数全部参数

obj : 请以 [待合并的数据1,待合并的数据2,...]:注意:一定把数据用[ ]括起来。

axis: =0 表示纵向合并,=1表示横向合并

join=:表示合并的交并集

join_axes:

ingnore_index :不保留原索引

部分参考:https://www.cnblogs.com/liuq/p/7019262.html

Python panads数据处理二相关推荐

  1. Python panads数据处理一

    文件读入 Pandas可以将读取到的表格型数据(文件不一定要是表格)转成DataFrame类型的数据结构,然后我们可以通过操作DataFrame进行数据分析,数据预处理以及行和列的操作等. 1.rea ...

  2. Python地理数据处理 二:Python基础知识

    目录 1.编写执行代码 2.脚本结构 3.变量 4.数据类型 4.1 布尔型 4.2 数值型 4.3 字符串 4.3.1 连接字符串 4.3.2 转义字符 4.4 列表和元组 4.5 集合 4.6 字 ...

  3. python基础代码库-Python基础数据处理库-NumPy

    最近更新:2017-07-19 NumPy是Python做数据处理的底层库,是高性能科学计算和数据分析的基础,比如著名的Python机器学习库SKlearn就需要NumPy的支持.掌握NumPy的基础 ...

  4. python对abaqus本构二次开发_基于Python的Abaqus二次开发实例讲解

    第 1 页 共 11 页 基于 Python 的 Abaqus 二次开发实例讲解 ( asian58 2013.6.26 ) 基于 Python 的 Abaqus 的二次开发便捷之处在于: 1 .所有 ...

  5. autocad python二次开发_基于Python AutoCAD ActiveX 二次开发,pyautocad应用技术

    AutoCAD应用程序开发系列 基于Python AutoCAD ActiveX 二次开发技术 主要库:pyautocad==0.2.0 内容#:基于Python AutoCAD ActiveX 二次 ...

  6. Python+医学院校二手书管理 毕业设计-附源码201704

    目  录 摘要 1 绪论 1.1研究意义 1.2研究现状 1.3系统开发技术的特色 1.4论文结构与章节安排 2基于Python医学院校二手书管理系统分析 2.1 可行性分析 2.2 系统流程分析 2 ...

  7. 基于Python医学院校二手书管理毕业设计-附源码201704

    目  录 摘要 1 绪论 1.1研究意义 1.2研究现状 1.3系统开发技术的特色 1.4论文结构与章节安排 2基于Python医学院校二手书管理系统分析 2.1 可行性分析 2.2 系统流程分析 2 ...

  8. 基于Python AutoCAD ActiveX 二次开发,pyautocad应用技术

    AutoCAD应用程序开发系列 基于Python AutoCAD ActiveX 二次开发技术 主要库:pyautocad==0.2.0 内容#:基于Python AutoCAD ActiveX 二次 ...

  9. Python爬虫-数据处理与存储

    Python爬虫-数据处理与存储 数据处理 ​ 可以使用pandas模块来实现数据处理,pandas是一个开源的并且通过BSD许可的库.它主要为Python语言提供高性能.易于使用数据结构和数据分析工 ...

最新文章

  1. lc412. Fizz Buzz
  2. 石墨烯区块链(3)软件升级
  3. 监控linux空间变化,Linux监控文件变化及主动上报实现
  4. input两种默认显示文字方式
  5. Spring bean三种创建方式
  6. JEECG - 基于代码生成器的J2EE智能开发框架 续四: 查询条件SQL生成器设计思路
  7. 生成网上下载的EF项目对应的数据库
  8. 深入解析大数据虚拟化的架构(下)- 系统架构
  9. 神马是敏捷?(3)——敏捷在中国的水土不服
  10. SIFT与SURF算法
  11. 苹果wifi测试中文软件,WiFi测评大师
  12. 怎样写商业计划书 【转载】
  13. 摇筛子动画 android,摇骰子动画
  14. 电子工程师12个忠告,新手老鸟都值得一看!
  15. 排序 ---- 快排(C语言)
  16. access计算机二级大纲,计算机二级Access考试内容大纲
  17. windows 10下 opessl 64位编译
  18. 常用网络结构:Alex,VGG,Resnet对比
  19. 娃娃乐学拼音软件许可及服务协议
  20. 基于51单片机的电子万年历设计

热门文章

  1. android 2.3 otg,学会使用手机的OTG功能-事半功倍-系列评测2
  2. python接收最新邮件_Python接收Gmail新邮件并发送到gtalk的方法
  3. floatmap 二维数组_第 2 章 数组
  4. 对android上下文和窗口的理解
  5. 9型转x型 cobol_9家企业入列省首批试点 建设培育产教融合型企业
  6. VR--VIVE-SteamVR API
  7. 移动测试之-流量测试方案
  8. at org.apache.hadoop.util.RunJar.main(RunJar.java:153)
  9. 1)Java JDK和JRE
  10. jvm lock低性能分析