pandas是Python的一个第三方数据分析库,其集成了大量的数据模型和分析工具,可以方便的处理和分析各类数据。Pandas中主要对象类型有Series,DataFrame和Index。本文介绍Series对象的创建和基本用法。
文章目录
一、Series对象的创建
使用下面的命令可以安装pandas:
pip install pandas
首次使用时需先导入pandas模块:
import pandas as pd
Series对象是带标签的一维同构数组,它采用pandas中Series类构造函数创建,语法是:
s = pd.Series(data, index=index)
- data是基础数据,可以是序列、字典、Numpy数组、常量等
- index是标签,如果忽略则默认生成从0开始,1为步长的等差数列作为标签,即1,2,3,4……
1.1 通过序列创建Series
可以通过给pd.Series函数传入列表,元组等序列来生成Series对象。
通过列表创建Series,由于没有指定index参数,因此默认的标签是0,1,2,3,4:
s1 = pd.Series([1,2,3,4,5])
通过元组创建Series,并通过index参数指定标签为abcde,Index必须和元素长度相同,但可以不唯一:
s2 = pd.Series((1,2,3,4,5), index=['a','b','c','a','b'])
1.2 通过NumPy数组创建Series
这里先通过np.random.randn(5)生成NumPy数组对象,然后再转换为Series对象:
s3 = pd.Series(np.random.randn(5), index=['a', 'b', 'c', 'd', 'e'])
1.3 通过字典创建Series
通过Python字典也可以生成Series对象,由于字典本身就是键-值对,因此键会自动作为Series对象的标签:
d = dict(a=1, b=2, c=3, d=4, e=5)
s4 = pd.Series(d)
使用字典创建时如果指定index对象,那么只有和index指定的索引匹配元素会被抽取出来,index中未匹配的索引会用NaN填充:
s5 = pd.Series(d, index=list('abcdx'))
上面例子中,字典中{‘e’:5}元素和index中索引不匹配,所以未出现在Series中。而index指定的标签’x’在字典中也无对应的键,所以用NaN(在Pandas中代表空)填充。
1.4 通过常量创建Series
如果仅指定一个常量,那么则会按照index指定的索引长度进行复制填充:
s6 = pd.Series(10, index=list('abcde'))
二、Series对象的引用
Series对象和普通序列一样可以通过标签或者位置对元素进行引用,还支持切片等操作。
2.1 通过标签引用
通过标签引用和Python中引用字典键的方式相同,它会返回标签对应的元素:
s6['a']
但如果标签不存在则会报错:
s6['x']
通过标签也可以进行切片,注意切片包含结尾:
s6['a':'c']
2.2 通过s.get()函数引用
通过s.get()函数可以通过标签引用单一元素(无法切片),但是当标签不存在时,它会返回None而不是报错,甚至可以在标签不存在时返回自定义值:
s6.get('a')
对于不存在的标签,定义返回999:
s6.get('x', 999)
2.3 通过.loc使用标签引用
Series的.loc属性也可用通过标签进行引用:
s6.loc['a']
2.4 通过.iloc使用位置引用
位置就是各个元素的位置编号,从0开始,与标签无关:
s6.iloc[0]
切片时,注意结尾是不包含的:
s6.iloc[0:2]
注意位置编号为2的元素并不在返回结果中,这点和.loc不同。
关于.loc和.iloc属性的详细用法和解释可以参考下面的文章:
Python 利用pandas处理CSV文件(DataFrame的基础用法)
三、Series对象的修改
Series对象创建后,我们也需要对它进行修改。
3.1 新增元素
通过指定不存在的标签和元素就可以添加新元素,这里添加一个不存在的索引’x’,其对应的值为999:
s6['x'] = 999
如果要将两个Series拼接起来,可以用pd.concat函数,以元组或列表的方式传入要拼接的Series对象,这里将s1和s2拼接起来:
pd.concat([s1,s2])
注意上面的拼接结果保留了各自的标签,使用ignore_index=True可以忽略原标签,重新生成标签:
pd.concat([s1,s2], ignore_index=True)
3.2 删除元素
删除元素可以在引用时使用del命令或者drop方法:
del s6['x']
使用drop方法删除元素’e’,注意drop方法默认是返回删除后的副本,原Series对象是不变的,再次查看元素’e’依然存在:
s6.drop('e')
s6
如果要在原Series上删除,需要指定inplace=True参数:
s6.drop('e', inplace=True)
s6
3.3 修改元素
只需要引用元素并重新赋值就可以修改元素值:
s6['a'] = 100
如果是切片的方式,可以同时修改多个元素值:
s6.loc['b':'d'] = 999
四、Series对象的常用属性
除了上面提到的.loc和.iloc,Series对象还有一些常用方便我们查询Series的相关信息。
4.1 name属性
name属性是Series名称,默认是空,你可以给这个属性赋值来对Series进行命名:
s6.name = 'ABC'
4.2 size属性
size属性可以查询Series中的元素个数:
s6.size
4.3 is_unique属性
is_unique属性可以快速判断Series中元素是否唯一,如果唯一则返回True:
s1.is_unique
s6.is_unique
4.4 dtype属性
dtype属性返回的是Series中元素的类型,例如下面s2的dtype就是int64(64位整型):
s2.dtype
由于Series是同构数组,如果加入其他类型的元素,则dtype会进行改变以兼容所有元素,下面加入一个浮点型元素,所有元素都会变为浮点型,dtype变为float64:
s2['e'] = 6.0
s2
再加入一个字符串元素,由于float64无法兼容字符串,Series的dtype属性自动转换为object(可以兼容所有类型数据):
s2['f'] = 'abc'
s2