栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 云计算 > 云平台

第8章 数据规整:聚合、合并和重塑

云平台 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

第8章 数据规整:聚合、合并和重塑

本章重点
数据可能分散在许多文件或数据库中,存储的形式也不利于分析。本章关注可以聚合、合并、重塑数据的方法。

总结 8.1 层次化索引 1.层次化索引

对于数据分散的情况常使用层次化索引,层次化索引是pandas的⼀项重要功能,它使你能在⼀个轴上拥有多个(两个以上)索引级别。抽象点说,它使你能以低维度形式处理高维度数据。

data=pd.Series(np.random.randn(9),
               index=[['a','a','a','b','b','c','c','d','d'],
                      [1,2,3,1,3,1,2,2,3]])
#输出  注意有两个索引  MultiIndex
#索引之间的“间隔”表示“直接使⽤上⾯的标签
a  1   -1.925518
   2    1.053123
   3   -0.760436
b  1    0.534796
   3   -1.025699
c  1    0.213862
   2   -0.483737
d  2   -0.356384
   3   -1.010102
dtype: float64

对于⼀个层次化索引的对象,可以使用所谓的部分索引,使用它选取数据子集的操作更简单。

data['a']
#输出
1   -0.446613
2    0.120970
3    0.990672
dtype: float64

切片: 注意先行后列

data.loc[:,	2]  # 先行后列
#输出
a    0.895573
c    0.638414
d   -1.139403
dtype: float64

层次化索引在数据重塑和基于分组的操作(如透视表生成)中扮演着重要的角色。如通过unstack方法将这段数据重新
安排到⼀个DataFrame中:

data.unstack()
#输出
     1	2	3
a	1.987082	-0.351358	-0.685920
b	0.595239	NaN	-0.668121
c	-0.944251	0.838090	NaN
d	NaN	1.353632	-0.998955

unstack的逆运算是stack。
对于⼀个DataFrame,每条轴都可以有分层索引:

frame=pd.DataFrame(np.arange(12).reshape((4,3)),
                    index=[['a','a','b','b'],[1,2,1,2]],
                    columns=[['Ohio','Ohio','Colorado'],['Green','Red','Green']])
frame
#输出
		Ohio	    Colorado
		Green	Red	Green
a	1	0	1	2
	2	3	4	5
b	1	6	7	8
	2	9	10	11

有了部分列索引,因此可以轻松选取列分组:

frame['Ohio']
#
		Green	Red
a	1	0	1
	2	3	4
b	1	6	7
	2	9	10
2.重排与分级排序

有时,你需要重新调整某条轴上各级别的顺序,或根据指定级别上的值对数据进行排序。**swaplevel接受两个级别编号或名称,**并返回⼀个互换了级别的新对象(但数据不会发生变化):

frame=pd.DataFrame(np.arange(12).reshape((4,3)),
                    index=[['a','a','b','b'],[1,2,1,2]],
                    columns=[['Ohio','Ohio','Colorado'],['Green','Red','Green']])
frame.index.names=['key1','key2']
frame.columns.names=['state','color']
frame.swaplevel('key1','key2') #swaplevel将index对调
#输出     index对调
				state	Ohio		Colorado
				color	Green	Red	Green
key2 key1			
1	a			0	1	2
2	a			3	4	5
1	b			6	7	8
2	b			9	10	11

而sort_index则根据单个级别中的值对数据进行排序。交换级别时,常常也会用到sort_index,最终结果就是按照指定顺序进行字母排序了。

3.根据级别汇总统计

许多对DataFrame和Series的描述和汇总统计都有⼀个level选项,它用于指定在某条轴上求和的级别。

frame.sum(level='key1')
#输出,key1上相同的index求和
'''
		state	Ohio		Colorado
		color	Green	Red	Green
key1			
a				3	5	7
b				15	17	19
'''

这其实是利用了pandas的groupby功能,后续将对其进行详细讲解。

4.使用DataFrame的列进行索引

人们经常想要将DataFrame的⼀个或多个列当做行索引来用,或者可能希望将行索引变成DataFrame的列。
DataFrame的set_index函数会将其一个或多个列转换为行索引,并创建⼀个新的DataFrame:

frame=pd.DataFrame({'a':range(5),
                    'b':range(5,0,-1),
                    'c':['one','one','two','two','two'],
                    'd':[0,1,2,4,3]})
frame2=frame.set_index(['c','d'])   #c,d变成了index.names
frame2
#输出   c  d变成行索引,index,c,d变成了index.names
		a	b
c	d		
one	0	0	5
	1	1	4
two	2	2	3
	4	3	2
	3	4	1

reset_index的功能跟set_index刚好相反,层次化索引的级别会被转移到列里⾯。

  • List item
8.2 合并数据集

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

  1. pandas.merge可根据⼀个或多个键将不同DataFrame中的行连接起来。SQL或其他关系型数据库的用户对此应该会比较熟悉,因为它实现的就是数据库的join操作。
  2. pandas.concat可以沿着⼀条轴将多个对象堆叠到⼀起。
  3. 实例方法combine_first可以将重复数据编接在⼀起,用⼀个对象中的值填充另⼀个对象中的缺失值。
1.数据库风格的DataFrame合并

数据集的合并(merge)或连接(join)运算是通过⼀个或多个键将行链接起来的。这些运算是关系型数据库(基于SQL)的核心。pandas的merge函数是对数据应用这些算法的主要切入点。

df1=pd.DataFrame({'key':['b','b','a','c','a','a','b'],
                'data1':range(7)})
df2=pd.DataFrame({'key':['a','b','d'],
                'data2':range(3)})
pd.merge(df1,df2)    #pd.merge(df1,df2,on='key')  等价
#输出   df1 df2中key都有a,b,按此合并
	key	data1	data2
0	b	0	1
1	b	1	1
2	b	6	1
3	a	2	0
4	a	4	0
5	a	5	0

上述程序并没有指明要用哪个列进行连接。如果没有指定,merge就会将重叠列的列名当做键。不过,最好明确指定⼀下。
如果列名不同,也可分别指定 pd.merge(df3,df4,left_on=‘lkey’, right_on=‘rkey’)
结果里面c和d以及与之相关的数据消失了。默认情况下,merge做的是“内连接”;结果中的键是交集。其他方式还有"left"、“right"以及"outer”。外连接求取的是键的并集,组合了左连接和右连接的效果。

选项说明
inner使用两个表都有键
left使用左表所有键
lright使用右表所有键
outer使用两个表所有键

多对多的合并有些不直观。看下面的例子

2.索引上的合并
  • List item
8.3 重塑和轴向旋转

有许多用于重新排列表格型数据的基础运算。这些函数也称作重塑(reshape)或轴向旋转(pivot)运算。

1.重塑层次化索引

层次化索引为DataFrame数据的重排任务提供了⼀种具有良好⼀致性的方式。主要功能有二:

stack:将数据的列“旋转”为行。 —降维
unstack:将数据的行“旋转”为列。 —升维

data=pd.DataFrame(np.arange(6).reshape((2,3)),
      index=pd.Index(['Ohio','Colorado'],name='state'),   columns=pd.Index(['one','two','three'],name='number'))                
data
#输出
number		one	two	three
state			
Ohio		0	1	2
Colorado	3	4	5

对该数据使用stack方法即可将列转换为行,得到⼀个Series:

data.stack()
#输出   将列转换为行
state     number
Ohio      one       0
          two       1
          three     2
Colorado  one       3
          two       4
          three     5
dtype: int32

对于⼀个层次化索引的Series,你可以用unstack将其重排为⼀个DataFrame,结果如data
默认情况下,unstack操作的是最内层(stack也是如此)
如果不是所有的级别值都能在各分组中找到的话,用unstack操作可能会引入缺失数据,stack默认会滤除缺失数据,因此该运算是可逆的

2.将“长格式”旋转为“宽格式”

多个时间序列数据通常是以所谓的“长格式”(long)或“堆叠格式”(stacked)存储在数据库和CSV中的。

  • List item

pivot其实就是用set_index创建层次化索引,再用unstack
重塑:

3.将“宽格式”旋转为“长格式”

旋转DataFrame的逆运算是pandas.melt。它不是将⼀列转换到多个新的DataFrame,而是合并多个列成为⼀个,产生⼀个比输入长的DataFrame。
key列可能是分组指标,其它的列是数据值。当使用
pandas.melt,我们必须指明哪些列是分组指标。下面使用key作为唯⼀的分组指标, pd.melt也可指定列的子集:

df=pd.DataFrame({'key':['foo','bar','baz'],
                'A':[1,2,3],
                'B':[4,5,6],
                })
melted=pd.melt(df,['key'])  #使⽤pivot,可以重塑回原来的样⼦
melted
#
	key		variable	value
0	foo		A		1
1	bar		A		2
2	baz		A		3
3	foo		B		4
4	bar		B		5
5	baz		B		6

因为pivot的结果从列创建了⼀个索引,⽤作行标签,我们可以使用reset_index将数据移回列:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/896370.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号