您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 9.Python科学计算与数据处理
1pandas—数据规整化目录合并数据集数据库风格的DataFrame合并索引上的合并轴向连接合并重叠数据重塑和轴向旋转重塑层次化索引将“长格式”旋转为“宽格式”2目录数据转换移除重复数据利用函数或映射进行数据转换替换值重命名轴索引离散化和面元划分检测和过滤异常值排列和随机采样计算指标/哑变量34数据分析和建模方面的大量编程工作都是用在数据准备上的:加载、清理、转换以及重塑。有时候,存放在文件或数据库中的数据并不能满足数据处理应用的要求。pandas和Python标准库提供了一组高级的、灵活的、高效的核心函数和算法,它们能够轻松地将数据规整化为正确的形式。合并数据集pandas对象中的数据可以通过一些内置的方式进行合并:pandas.merge可根据一个或多个键将不同DataFrame中的行连接起来。Pandas.concat可以沿着一条轴将多个对象堆叠到一起。实例方法combine_first可以将重复数据编接在一起,用一个对象中的值填充另一个对象中的缺失值。5合并数据集数据库风格的DataFrame合并数据集的合并(merge)或连接(join)运算是通过一个或多个键将行链接起来的。这些运算是关系型数据库的核心。pandas的merge函数是对数据应用这些算法的主要切入点。以一个简单的例子开始:6frompandasimportSeries,DataFrameimportpandasaspddf1=DataFrame({'key':['b','b','a','c','a','a','b'],'data1':range(7)})df2=DataFrame({'key':['a','b','d'],'data2':range(3)})合并数据集这是一种多对一的合并。df1中的数据有多个被标记为a和b的行,而df2中key列的每个值则仅对应一行。对这些对象调用merge即可得到:注意,并没有指明要用哪个列迸行连接。如果没有指定,merge就会将重叠列的列名当做键。不过,最好显式指定一下:7df1df2pd.merge(df1,df2)pd.merge(df1,df2,on='key')合并数据集如果两个对象的列名不同,也可分别进行指定:结果里面c和d以及与之相关的数据消失了。默认情况下,merge做的是“inner”连接:结果中的键是交集。其他方式还有“left”、“right”以及“outer”。外连接求取的是键的并集,组合了左连接和右连接的效果:8df3=DataFrame({'lkey':['b','b','a','c','a','a','b'],'data1':range(7)})df4=DataFrame({'rkey':['a','b','d'],'data2':range(3)})pd.merge(df3,df4,left_on='lkey',right_on='rkey')pd.merge(df1,df2,how='outer')合并数据集多对多的合并操作非常简单,无需额外的工作。如下所示:多对多连接产生的是行的笛卡尔积。由于左边的DataFrame有3个“b”行,右边的有2个,所以域终结果中就有6个“b”行。连接方式只影响出现在结果中的键:9df1=DataFrame({'key':['b','b','a','c','a','b'],'data1':range(6)})df2=DataFrame({'key':['a','b','a','b','d'],'data2':range(5)})df1pd.merge(df1,df2,on='key',how='left')pd.merge(df1,df2,how='inner')合并数据集要根据多个键进行合并,传入一个由列名组成的列表即可:结果中会出现哪些键组合取决于所选的合并方式,也可以这样来理解:多个键形成一系列元组,并将其当做单个连接键(当然,实际上并不是这么回事)。注意:在进行列-列连接时,DataFrame对象中的索引会被丢弃。10left=DataFrame({'key1':['foo','foo','bar'],'key2':['one','two','one'],'lval':[1,2,3]})right=DataFrame({'key1':['foo','foo','bar','bar'],'key2':['one','one','one','two'],'lval':[4,5,6,7]})pd.merge(left,right,on=['key1','key2'],how='outer')合并数据集11对于合并运算需要考虑的最后一个问题是对重复列名的处理。虽然可以手工处理列名重叠的问题,但merge有一个更实用的suffixes选项,用于指定附加到左右两个DataFrame对象的重叠列名上的字符串:merge函数的参数pd.merge(left,right,on='key1‘)pd.merge(left,right,on='key1',suffixes=('_left','_right'))参数说明left参与合并的左侧DataFrameright参与合并的右侧DataFramehow“inner”、“outer”、“left”、“right”其中之一。默认为“inner”合并数据集12参数说明on用于连接的列名。必须存在于左右两个DataFrame对象中。如果未指定,且其他连接键也未指定,则以left和right列名的交集作为连接键left_on左侧DataFrame中用作连接键的列right_on右侧DataFrame中用作连接键的列leftjndex将左侧的行索引用作其连接键rightjndex类似于leftjndexsort根据连接键对合并后的数据进行排序,默认为True。有时在处理大数据集时,禁用该选项可获得更好的性能suffixes字符串值元组,用于追加到重叠列名的末尾,默认为(‘_x’,’_y’).例如,如果左右两个DataFrame对象都有data,则结果中就会出现“data一x”和“data一y”copy设置为False,可以在某些特殊情况下避免将数据复制到结果数据结构中。默认总是复制合并数据集索引上的合并有时DataFrame中的连接键位于其索引中。在这种情况下,你可以传入left_index=True或right_index=True(或两个都传)以说明索引应该被用作连接键:13pd.merge(left,right,on='key1',suffixes=('_left','_right'))left1=DataFrame({'key':['a','b','a','a','b','c'],'value':range(6)})right1=DataFrame({'group_val':[3.5,7]},index=['a','b'])left1right1pd.merge(left1,right1,left_on='key',right_index=True)合并数据集由于默认的merge方法是求取连接键的交集,因此可通过外连接的方式得到它们的并集:对于层次化索引的数据,稍微复杂些:14pd.merge(left1,right1,left_on='key',right_index=True,how='outer')lefth=DataFrame({'key1':['Ohio','Ohio','Ohio','Nevada','Nevada'],'key2':[2000,2001,2002,2001,2002],'data':np.arange(5.)})righth=DataFrame(np.arange(12).reshape((6,2)),index=[['Nevada','Nevada','Ohio','Ohio','Ohio','Ohio'],[2001,2000,2000,2000,2001,2002]],columns=['event1','event2'])lefthrighth合并数据集这种情况下,必须以列表的形式指明用作合并键的多个列(注意对重复索引值的处理):同时使用合并双方的索引也没问题:15pd.merge(lefth,righth,left_on=['key1','key2'],right_index=True)pd.merge(lefth,righth,left_on=['key1','key2'],right_index=True,how='outer')left2=DataFrame([[1.,2.],[3.,4.],[5.,6.]],index=['a','c','e'],columns=['Ohio','Nevada'])right2=DataFrame([[7.,8.],[9.,10.],[11.,12.],[13,14]],index=['b','c','d','e'],columns=['Missouri','Alabama'])left2right2pd.merge(left2,right2,how='outer',left_index=True,right_index=True)合并数据集16DataFrame还有一个join实例方法,它能更为方便地实现按索引合并。它还可用于合并多个带有相同或相似索引的DataFrame对象,而不管它们之间有没有重叠的列。由于一些历史原因(早期版本的pandas),DataFrame的join方法是在连接键上做左连接。它还支持参数DataFrame的索引跟调用者DataFrame的某个列之间的连接:left2.join(right2,how='outer')left1.join(right1,on='key')合并数据集17最后,对于简单的索引合并,还可以向join传入一组DataFrame(后面会介绍更为通用的concat函数,它也能实现此功能):another=DataFrame([[7.,8.],[9.,10.],[11.,12.],[16.,17.]],index=['a','c','e','f'],columns=['NewYork','Oregon'])left2.join([right2,another])left2.join([right2,another],how='outer')合并数据集轴向连接另一种数据合并运算也被称作连接(concatenation)、绑定(binding)或堆叠(stacking)。NumPy有一个用于合并原始NumPy数组的concatenation函数:18arr=np.arange(12).reshape((3,4))arrarray([[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对象(如Series和DataFrame),带有标签的轴能够进一步推广数组的连接运算。假设有三个没有重叠索引的Series:对这些对象调用concat可以将值和索引粘合在一起:19s1=Series([0,1],index=['a','b'])s2=Series([2,3,4],index=['c','d','e'])s3=Series([5,6],index=['f','g'])pd.concat([s1,s2,
本文标题:9.Python科学计算与数据处理
链接地址:https://www.777doc.com/doc-5691799 .html