上一篇数据文章中,我们介绍了Numpy里面的一些结构,那么这次我们来介绍一些更好玩的东西----Pandas。Pandas这个东西在数据的世界里用的还是很频繁的,主要是用起来会比较方便。相对Numpy而言的话,pandas属于那种青出于蓝而胜于蓝这样的一个角色。pandas是基于numpy的基础上进行开发的,所以安装pandas的时候会自带性的把numpy也安装上去。
上期的内容我们主要是针对Numpy里面的一些数据结构和统计函数做了一番介绍,了解了ndarry是怎样的一个结构(说白了就是一个数据,或是一个矩阵),那么今天我们来看看,在Pandas里面又有怎样的一个数据结构呢?
今天我们就主要来聊聊Series~~~~
Pandas Series
Pandas里面的Serise是一种类似于一维数组的对象,是由一组数据(各种NumPy数据类型)以及一组与之相关的数据标签(即索引)组成。仅由一组数据也可产生简单的Series对象。(注意:Series中的索引值是可以重复的)
我们可以看一下下面这一张图:
这样的一列就是一个Series。 对于每一列而言,他们都是一个series,这就像数据库表里面的列。
那我们来看看下面这张图,如何来创建一个Series。
直接使用pandas去找Series就可以啦!
import pandas as pd a = pd.Series([1, 2, 3, 4]) b = pd.Series(data=[1, 2, 3, 4], index=['a', 'b', 'c', 'd']) print(a) print(b)
我们来看一下运行结果:
a的运行结果就是一列索引对应着一列值(索引的值和给的值是一一对应的~~就和python里面的字典一样)。如果没有指定索引的值,默认是从0开始的,就和python里面的list取值是一样的。
如果需要改变索引,只需要在Series方法里面加上index参数即可修改索引,不过要注意的是,给定数据的长度要和索引的长度是一样的,这样才会生效,否则就会报错。
下面我们来看一下series的属性:
编号 | 属性/方法 | 描述 |
1 | axes | 返回行轴标签列表。 |
2 | dtype | 返回对象的数据类型(dtype)。 |
3 | empty | 如果系列为空,则返回True。 |
4 | ndim | 返回底层数据的维数,默认定义:1。 |
5 | size | 返回基础数据中的元素数。 |
6 | values | 将系列作为ndarray返回。 |
7 | head() | 返回前n行。 |
8 | tail() | 返回最后n行。 |
下面问题来了,我们如何结合Numpy去创建一个Series呢?
import numpy as np import pandas as pd data = np.array(['Amy', 'Ben', 'Candy', 'David']) A = pd.Series(data) print(A)
我们可以直接把ndarray生成的数据当作参数放到Serise里面。
如果想指定索引的值可以加上index参数:
mport numpy as np import pandas as pd data = np.array(['Amy', 23, '女', 99]) A = pd.Series(data, index=["name", "age", "gender", "point"]) print(A)
那如何使用字典创建Series呢?
data = {'a': 1, 'b': 2, 'c': 3} B = pd.Series(data) print(B)
也是直接创建即可。
讲完了创建那就来说一说取值吧,Series里面的值如何取出来呢?
Series值的获取主要有两种方式:
1、通过方括号+索引的方式读取对应索引的数据,有可能返回多条数据。
2、通过方括号+下标值的方式读取对应下标值的数据,下标值的取值范围为:
[0,len(Series.values));
另外下标值也可以是负数,表示从右往左获取数据。
import pandas as pd A = pd.Series([1, 2, 3, 4, 5], index=['a', 'b', 'c', 'd', 'e']) print(A[1]) print(A['a']) print(A['d'])
可以使用默认索引,也可以使用给定的索引。
它还可以像python里面的list一样进行切片。
import pandas as pd A = pd.Series([1, 2, 3, 4, 5], index=['a', 'b', 'c', 'd', 'e']) print(A[:3]) print(A[4:2:-1]) print(A['a':'d']) print(A['e':'c':-1])
Series里面的删除操作使用的是drop方法和pop方法:
import pandas as pd series1 = pd.Series([10, 20, 30, 40], index=list('abcd')) # 删除元素返回副本 print(series1.drop('c')) print(series1.drop(['a', 'd'])) # 删除源数据中的元素 series1.pop('d') print(series1)
使用drop方法的时候会生成一个新的Series,新的Series里面就是删除该元素的Series,
使用pop方法删除,就是对原来的Series进行修改删除。
如果你想在Series中插入值的话,和字典的原理是一样的:
import pandas as pd series1 = pd.Series([10, 20, 30, 40], index=list('abcd')) # 新增一个标签索引值为f,值为100的元素 series1['f'] = 100 print(series1)
当然还可以使用append方法进行添加,但是和刚刚不一样的是,他会生成一个新的Series来存储添加后的数据:
series2 = pd.Series([100, 200], index=['g', 'h']) series3 = series1.append(series2) print(series3)
最后我们来说一下Series里面的统计函数。
1、求和函数SUM
import pandas as pd val = [1000, 201, None, 104] t = pd.Series(val, index=[1, 2, 3, 4]) print(t) print('sum=', t.sum())
数学达到高数水平的可以简单看看下面这个表达式:
2、均值函数MEAN
import pandas as pd val = [1000, 201, None, 104] t = pd.Series(val, index=[1, 2, 3, 4]) print(t) print('average=', t.mean())
同样的,数学表达式如下:
3、最大函数MAX
max函数可以返回series里最大值,而idxmax返回的是其index或者label。
import pandas as pd val = [1000, 201, None, 104] t = pd.Series(val, index=[1, 2, 3, 4]) print('max=', t.max())
4、方差函数VAR
方差说起来比较抽象,算起来就是拿每个数和平均数做差再平方,注意考量的就是这串数据的稳定性。方差越小越好,
举个例子,小明的高考冲刺模拟五次成绩是303,321,339,288,403,小刚的成绩是,323,351,343,328,311请问哪个同学的成绩更加稳定?
(不要问分数为什么这么低-------江苏省高考)
很明显我们可以看到小刚的成绩更加趋于稳定,因为小刚成绩的波动范围比较小,不像小明,波动的比较大。
那么我们用方差来论证这个观点:
import pandas as pd xiaoming = [303, 321, 339, 288, 403] xiaogang = [323, 351, 343, 328, 311] t = pd.Series(xiaoming) p = pd.Series(xiaogang) print('xiaoming=', t.var()) print('xiaogang=', p.var())
很明显我们可以看到,小刚的方差更小,所以小刚的成绩更加稳定。
数学公式如下:
5、标准差函数STD
说的简单一点,他就是和方差一样的,也是考量一组数据的稳定性,具体值就是方差开平方。也就是把上面那个表达式的平方去掉即可。
import pandas as pd xiaoming = [303, 321, 339, 288, 403] xiaogang = [323, 351, 343, 328, 311] t = pd.Series(xiaoming) p = pd.Series(xiaogang) print('xiaoming=', t.std()) print('xiaogang=', p.std())
数学表达式:
6、平均绝对离差函数MAD
平均绝对离差是用样本数据相对于其平均值的绝对距离来度量数据的离散程度。
画个图你就懂了:
红线就是平均值,红色的小点点就是一组数据,距离红线越近就越偏向稳定。用肉眼看来,很明显上面一个数据会比较好。
我们依旧用小明和小刚的分数来算平均绝对离差:
import pandas as pd xiaoming = [303, 321, 339, 288, 403] xiaogang = [323, 351, 343, 328, 311] t = pd.Series(xiaoming) p = pd.Series(xiaogang) print('xiaoming=', t.mad()) print('xiaogang=', p.mad())
还是小刚的数据比较小。
数学表达式:
(每个数据减去均值求绝对值,如何再求这些绝对值的平均值)
总的来说,我们期望数据的离散程度越小越好(就是分布的范围越小越好)。
上面的三个函数,都是用来计算数据的离散程度的。
7、协方差函数COV
表达式:
(别问我啥意思了,根据上面的表达式,自己猜一下吧-_-!
提示:方差是协方差的一种特殊情况,即当两个变量是相同的情况)
看下面的代码理解一下:
import pandas as pd xiaoming = [303, 321, 339, 288, 403] xiaogang = [323, 351, 343, 328, 311] average_xiaoming = pd.Series([330.8, 330.8, 330.8, 330.8, 330.8]) average_xiaogang = pd.Series([331.2, 331.2, 331.2, 331.2, 331.2]) t = pd.Series(xiaoming) p = pd.Series(xiaogang) print('xiaoming=', t.cov(average_xiaoming)) print('xiaogang=', p.cov(average_xiaogang))
8、偏太值函数SKEW
偏态值用于衡量成绩分布服从正态分布的程度
正态分布,又叫常态分布,像一只倒扣的钟。两头低,中间高,左右对称。大部分数据集中在平均值,小部分在两端,如下图:
import pandas as pd xiaoming = [303, 321, 339, 288, 403] t = pd.Series(xiaoming) print('xiaoming=', t.skew())
9、峰度函数KURT
峰度(Kurtosis)衡量实数随机变量概率分布的峰态。峰度高就意味着方差增大是由低频度的大于或小于平均值的极端差值引起的。
在相同的标准差下,峰度系数越大,分布就有更多的极端值,那么其余值必然要更加集中在众数周围,其分布必然就更加陡峭。
import pandas as pd xiaoming = [303, 321, 339, 288, 403] t = pd.Series(xiaoming) print('xiaoming=', t.kurt())
关于Series的内容差不多到这里就结束啦!有问题可以私信进行提问哦!(因为暂不支持留言,只能私信啦!)