pandas基本数据类型---series(序列)

series是pandas里一种类似于一维数组的对象,是由一组数据(各种NumPy数据类型)以及一组与之相关的数据标签(即索引)组成。仅由一组数据也可产生简单的Series对象

pandas中的series有一点点像list,但这样说只是为了让你很容易接受这种数据结构。他们之间有一点非常大的不同,list可以存储任何类型的数据,但是series只能存储一种类型的数据,但这也让它对内存的利用更加高效。

1、创建

1.1 基于list创建

下面的代码根据一个list创建一个series,通过对创建出来的series进行观察,我们将对series建立一个基础的理解

from pandas import Series

lst = ['python', 'c++', 'c#', 'java']
ser = Series(lst)

print(ser)

程序输出结果为:

0    python
1       c++
2        c#
3      java
dtype: object

对ser对象进行分析,我们不难得出出以下几个结论

  1. series 的数据有着明确的类型,也就是dtype
  2. series 里的数据顺序和lst里的元素的顺序相同,这说明建立series时不改变list的元素顺序
  3. series 有明确的索引,也就是第一列的 0 1 2 3

1.1.1 指定索引

series 里有索引这种东西,那么我们就探索一下, 看看在创建series时能否指定索引

from pandas import Series

lst = ['python', 'c++', 'c#', 'java']
ser = Series(lst, index=['a', 'b', 'c', 'd'])
print(ser)

程序输出

a    python
b       c++
c        c#
d      java
dtype: object

由上面的结果可知,series的索引是可以指定的,说道这里,就要思考一下series和list的相似与不同之处了

  1. 他们都能按指定顺序存储一系列数据
  2. 他们都有索引的概念,但list的索引是固定的,只和元素多少有关,从0开始,而series的索引可以是指定的,索引可以字符串,如果不指定索引,那么就默认生成从0开始的索引

从这两点上来看,series更加灵活,毕竟它可以指定索引,这样,再访问起来时就更方便了。

1.2 基于dict创建

看上去,series有一点像list,但是索引更加灵活,但这样,就又有点像dict了,下面讨论一下series和dict的相似与不同
先来看看如何基于dict创建一个series

from pandas import Series

score_dict = {
    'python': 100,
    'c++': 99,
    'c#': 98,
    'java': 97
}

ser = Series(score_dict)
print(ser)

程序输出结果

python    100
c++        99
c#         98
java       97
dtype: int64

从结果上看,字典的key自动转化为了series的索引,字典的value部分自动转化为了series的存储数据,接下来看看如何用索引操作series

print(ser['c++'])
ser['java'] = 100
print(ser)

程序输出结果

99
python    100
c++        99
c#         98
java      100
dtype: int64

和字典一样,可以通过索引进行访问,修改,如果是这样,series似乎和字典没有什么区别了,但其实不然,series本质上是一个一维数组类型的数据,因此,即便是基于dict创建的series,也仍然可以使用那些数组才有的操作方法,例如切片操作

1.3 切片

from pandas import Series

score_dict = {
    'c++': 99,
    'python': 100,
    'c#': 98,
    'java': 97
}

ser = Series(score_dict)
print(ser.index)
print(ser[0])
print(ser[1:])

程序输出结果为

Index(['c++', 'python', 'c#', 'java'], dtype='object')
99
python    100
c#         98
java       97
dtype: int64

基于dict创建的series,虽然根据字典的key生成了索引,但是仍然可以像访问list那样利用数组下标去访问,而且支持切片操作,这种能力就是字典所不具备的

2.数据转换

2.1 转成list和dict

前面提供了基于list和dict创建series的示例,那么反过来,也一定可以从series中转换出list和dict,下面是一段示例代码

from pandas import Series

score_dict = {
    'c++': 99,
    'python': 100,
    'c#': 98,
    'java': 97
}

ser = Series(score_dict)

print(ser.tolist())
print(ser.to_dict())

程序输出结果

[99, 100, 98, 97]
{'c++': 99, 'python': 100, 'c#': 98, 'java': 97}

2.2 输出到文件

from pandas import Series

score_dict = {
    'c++': 99,
    'python': 100,
    'c#': 98,
    'java': 97
}

ser = Series(score_dict)
ser.to_excel('data.xls')

数据最终保存在了data.xls文件中
Series数据保存到excel文件

3.特殊功能

说其特殊,都是相比于list,dict这种原生类型数据而言的

3.1 自动对齐

from pandas import Series

score_dict_1 = {
    'c++': 99,
    'python': 100,
    'c#': 98,
    'go': 97
}

score_dict_2 = {
    'node.js': 99,
    'python': 100,
    'c#': 98,
    'java': 97
}

ser_1 = Series(score_dict_1)
ser_2 = Series(score_dict_2)

res = ser_1 + ser_2
print(res)

对两个series进行相加操作,则会根据索引进行相加,如果一方没有某个索引,则值为NaN
输出结果为

c#         196.0
c++          NaN
go           NaN
java         NaN
node.js      NaN
python     200.0
dtype: float64

3.2 name属性

series对象有一个name属性,其索引也有name属性,这样可以更好的标识数据特征

from pandas import Series

score_dict = {
    'c++': 99,
    'python': 100,
    'c#': 98,
    'go': 97
}

ser = Series(score_dict)
ser.name = 'score'
ser.index.name = 'program'

print(ser)

程序输出结果

program
c++        99
python    100
c#         98
go         97
Name: score, dtype: int64

还有很多其他功能,不一一列举,你可以通过官方文档查看。

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案