第八篇,数据分析之pandas的数据索引和切片

mac2024-05-27  37

以前在Numpy写过索引和切片可以参考Numpy的操作

Series对象

首先导入我们的Numpy与Pandas import pandas as pd import numpy as np

a = np.array([2345,6789,1234,5678]) b = pd.Series(a,index=['python','java','html','c']) print(b['java']) print('java' in b) print('hadoop' in b) print(b.keys()) 6789 True False Index(['python', 'java', 'html', 'c'], dtype='object')

不难看出来在[ ]里面放置的是标签索引的一个值,类似于数组中用整数作为下标。比如b[‘java’],就是以某一个标签索引下标获得其对应的数据。索引与数据之间这种映射类似于python中的字典对象key与value之间的关系,所以也可以使用一些字典的方法。 附加:

b['hadoop'] = 9874 #增加一个 print(b) c = b['java':'hadoop'] #获取到数据的下标,前包括,后也包括 print(c) python 2345 java 6789 html 1234 c 5678 hadoop 9874 dtype: int64 java 6789 html 1234 c 5678 hadoop 9874 dtype: int64

注意这里,你会发现,他并没有遵守Python序列的“前包括,后不包括”的规则,它是包括了结束标签索引的值。还有一个区别,就是它每次切出来的部分生成了一个新的对象,没有那种Numpy中所谓的“共用视图”,可以观察一下代码。

c['spark'] = 5432 print(c) print(b) java 6789 html 1234 c 5678 hadoop 9874 spark 5432 dtype: int64 python 2345 java 6789 html 1234 c 5678 hadoop 9874 dtype: int64

重点又来了如下代码,还是跟着上面代码后面写

print(b[2]) print(b[1:4]) 1234 java 6789 html 1234 c 5678 dtype: int64

你会突然发现,根据下标的位置索引又按照"前包括,后不包括"的方式了,这个时候我们可以写个测试的方法如下。

d = pd.Series(np.random.rand(4),index=[1,3,5,7]) print(d) print(d[1]) print(d[1:3]) 1 0.373752 3 0.227697 5 0.825495 7 0.152058 dtype: float64 0.3737523265812278 3 0.227697 5 0.825495 dtype: float64

可以看出来,上面的d[1]中这个1按我们之前写的应该是位置索引啊,怎么看起来是标签索引,那再看看d[1:3],怎么里面的1又变成了位置索引了,这个时候是不是觉得很乱,于是针对索引有个专门的方法。跟着上面继续写。

print(d) print(d.iloc[1]) print(d.iloc[1:3]) 1 0.446437 3 0.341855 5 0.298457 7 0.448216 dtype: float64 0.34185531311777173 3 0.341855 5 0.298457 dtype: float64

这个series.iloc[ ]方法里面只接收位置索引,如果想通过位置索引获得某个数据,这个方法还是很好用的,当然肯定也有我们的标签索引如下。这些方法不仅适用于Series对象还适用于DataFrame对象。

print(d.loc[1:3]) 1 0.564683 3 0.727926 dtype: float64

根据MultiIndex对象切片:

a = [('book',2015),('book',2016),('teacher',2015),('teacher',2016)] b = pd.MultiIndex.from_tuples(a) c = pd.Series([2500,2600,2700,2800],index=b) print(c['book']) #返回一个Series对象 print(c.loc['book']) print(c.iloc[0]) #返回第一个数值 print(c.loc['book',2016]) #深入到第一级索引 print(c.loc[:,2015]) #获取所有标签为2015的数值 2015 2500 2016 2600 dtype: int64 2015 2500 2016 2600 dtype: int64 2500 2600 book 2500 teacher 2700 dtype: int64

DataFrame对象

a = pd.Series([2014,2015,2016],index=['java','python','hadoop']) b = pd.Series([12345,23456,56789],index=['java','python','hadoop']) c = pd.DataFrame({'gdp':b,'pop':a}) print(c) print(c['gdp']) print(c.iloc[1]) #接收的是位置索引,DataFrame就变成了一个二维数组 print(c.iloc[1,1]) print(c.loc['java']) print(c['java':'python'])#前包括,后也包括 gdp pop java 12345 2014 python 23456 2015 hadoop 56789 2016 java 12345 python 23456 hadoop 56789 Name: gdp, dtype: int64 gdp 23456 pop 2015 Name: python, dtype: int64 2015 gdp 12345 pop 2014 Name: java, dtype: int64 gdp pop java 12345 2014 python 23456 2015

注意:Series对象是一维的,只有一个方向的索引,而DataFrame则有两个维度,于是print(c[‘gdp’])方法就是用来读取列的,如果修改[ ]里面的值为字段名称或者列的索引名称,没有明确的指定就会报错。

最新回复(0)