Pandas中含有两种主要的数据结构:Series和Dataframe,本篇笔记记录的是Series。
另一篇关于dataframe的https://blog.csdn.net/JT_WPC/article/details/104160416
笔记内容的结构:
-
Series简介;
-
构建series的几种情况;
-
Series的特点;
-
Series的常见操作。
Series简介
Series的API文档传送门,介绍了Series的所有属性和方法。Series是一维的含有标记名的纵向数组,其中标记名指的是对应行的数据的名字,数据的类型任意(整数、字符串、浮点数、Python对象等)。数据的标签统称为index。默认情况下,数据对齐总是发生的。所谓数据对齐,指的是数据和标签名一一对应,除非是显式操作,否则不会中断标签和数据之间的对应关系。
首先导入numpy和pandas包:
import numpy as np
import pandas as pd
创建一个Series的基本语法是:
s = pd.Series(data, index = index)
上面的代码中,data参数内容可以是:
-
一个python字典;
-
一个ndarray数组;
-
一个标量数值,例如,9
而后面的作为参数传进去的index,是每一行的行名称,也称为轴(axis)的标签,由于series为纵向数组,所以每一行只有一个元素。
构建Series
根据data参数类型的不同,可以分为如下几种情况来构建series:
1.从ndarray中获取数据:
如果data参数是一个ndarray类型,那么index的长度必须和data的相同,如果没有index参数传入,则会自动生成一个int类型的index,数值范围为[0,……,len(data)-1]。
tips:ndarray是numpy中生成数据的默认类型。
s = pd.Series(np.random.randn(5), index=['a','b', 'c', 'd', 'e']) # 指定index
输出:s-------------------
a -0.049119
b -1.202170
c 2.024288
d 0.165342
e -0.621071
dtype: float64
可以通过series的index属性查看设定的标签名:
s.index
--------------------
Index(['a',
'b',
'c',
'd',
'e'],
dtype='object')
pd.Series(np.random.randn(5)) # 不指定index参数
--------------------
0 -0.389217
1 -0.890973
2 -1.056253
3 0.114149
4 0.040947
dtype: float64
请注意,pandas允许index值重复,如果尝试进行不支持重复index的操作,则会引发异常。
s = pd.Series(np.random.randn(5), index=['a','a', 'c', 'd', 'e'])
输出s--------------------
a 1.287479
a -0.410150
c 0.415739
d 1.003693
e 1.929771
dtype: float64
2.从字典中获取数据
从字典中获取数据构建Series时,字典的key转换为行标签,也就是axis的label。
d = {'b':1, 'a':0, 'c':2}
pd.Series(d)
--------------------
b 1
a 0
c 2
dtype: int64
请注意,python推荐版本是3.6及以上,如果python版本小于3.6,可能出现生成的Series中数据按照key的字典顺序排序的情况。
如果data参数为字典类型的同时也传递了index参数,将会发生数据与标签的自动对齐:从data中提取出与index中的标签对应的数据;当某标签没有对应值时,使用NaN作为缺失值进行填充。
tips:NaN(not a number)在pandas中表示该数据缺失。
pd.Series(d, index=['a','b', 'c','d']) # 这里按照index参数中的顺序自动对齐,用NaN表示缺失值
--------------------
a 0.0
b 1.0
c 2.0
d NaN
dtype: float64
3.从标量中获取数据
如果数据是标量值,则必须提供index参数。标量值将被复制,用以匹配索引的长度。
pd.Series(5., index=['a', 'b', 'c', 'd', 'e'])
--------------------
a 5.0
b 5.0
c 5.0
d 5.0
e 5.0
dtype: float64
Series的特点
pandas是在其他科学计算包的基础上发展起来的,因此和某些数据类型存在相似之处,这也为我们学习pandas提供了便利。
1.Series类似于ndarray
Series类似于ndarray,因此存在和ndarray相同的操作逻辑。Series也可以充当大多数NumPy函数的有效参数。诸如切片之类的操作也将对index进行切片。
'''
s中的内容
a 0.587248
b -0.182482
c 0.764298
d 1.075891
e 0.168112
dtype: float64
'''
s[0] # 输出位置0的内容
s[:3] # 输出 [0:3) 范围里的内容
s[s > s.median()] # 输出大于中位数的内容
s[[4, 3, 1]] # 依次输出位置为4、3、1的内容
np.exp(s) # 以e为底进行指数运算
依次输出以下内容--------------------
0.5872479154486413
a 0.587248
b -0.182482
c 0.764298
dtype: float64
c 0.764298
d 1.075891
dtype: float64
e 0.168112
d 1.075891
b -0.182482
dtype: float64
a 1.799031
b 0.833199
c 2.147486
d 2.932605
e 1.183069
dtype: float64
与NumPy数组一样,pandas的Series也有dtype属性,用于获取series中数据的类型。
s.dtype
--------------------
dtype('float64')
这通常是一个NumPy dtype。pandas和第三方库在一些地方扩展了NumPy的类型系统,此时,dtype应该是ExtensionDtype。
使用series.array属性,从Series中得到一个真正的数组,然后像操作数组那样对其进行访问和修改,例如series.array[2] = 3:
s.array
--------------------
<PandasArray>
[ 0.5872479154486413,
-0.18248229943536817,
0.7642976985377575,
1.0758911939753029,
0.168111559544036]
Length: 5, dtype: float64
2.Series类似于字典dict
series类似于固定大小的dict,可以通过index标签获取和设置值。
'''
s中的初始内容:
a 2.000000
b -0.182482
c 0.764298
d 1.075891
e 0.168112
dtype: float64
'''
In : s['a']
Out: 2.000000
In : s['a'] = 3
In : s
Out:
a 3.000000
b -0.182482
c 0.764298
d 1.075891
e 0.168112
dtype: float64
In : 'e' in s
Out: True
In : 'f' in s
Out: False
如果进行索引时,使用的index标签不存在,则会引发异常,而不是自动添加,因为这里series的长度不可变:
In : s['f']
Out: ---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
~\Anaconda3\envs\AI\lib\site-packages\pandas\core\indexes\base.py in get_value(self, series, key)
...
pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()
KeyError: 'f'
类似于字典的get方法,如果标签缺失,将返回None或指定的默认值:
In : s.get('f')
In : s.get('f', '不存在')
Out: '不存在'
Series的常用操作
1.向量化操作以及label和Series的对齐
在处理原始NumPy数组时,通常不需要逐个值地循环,在处理pandas的series时也是如此。series也可以作为参数传递到大多数NumPy方法中。
In : s + s
Out:
a 6.000000
b -0.364965
c 1.528595
d 2.151782
e 0.336223
dtype: float64
In : s * 2
Out:
a 6.000000
b -0.364965
c 1.528595
d 2.151782
e 0.336223
dtype: float64
Series和ndarray之间的一个关键区别是Series之间的操作会根据标签自动对齐数据。因此编写代码进行计算的时候不必考虑所涉及的Series是否具有相同的标签。例如下面的操作,对同一个series进行了不同的偏移,然后相加。计算时,仍然是对应的label进行相加,这就是自动对齐:
In : s[1:] + s[2:]
Out:
b NaN
c 1.528595
d 2.151782
e 0.336223
dtype: float64
2.name属性
Series也具有name属性,在生成Series的时候可以通过name参数进行设定,也可以在生成Series之后通过name属性进行设定和修改,但是正规点的修改的方式是使用Series的rename方法进行名字的修改。
In : s = pd.Series(np.random.randn(5), name='a_series')
In : s
Out:
0 -0.494929
1 1.071804
2 0.721555
3 -0.706771
4 -1.039575
Name: a_series, dtype: float64
In : s.name
Out: 'a_series'
In : s.name = 'Wang_PChao'
In : s.name
Out: 'Wang_PChao'
In : s.rename("another_name")
In : s.name
Out: 'another_name'