Series数据结构
1 概念
Series
就像是竖着的list
。所以,一般创建Series
需传入一个list
。
同时,它包含了 dict
的特点,用get进行取值,同样,也可以使用ndarray的特点进行切片操作。
示例-1 创建一个简单的Series
import pandas as pd
import numpy as np
s = pd.Series([1,2,3,np.nan,5,6])
print(s)
#执行结果
0 1
1 2
2 3
3 NaN
4 5
5 6
注:
① numpy
中对不存在的值,都赋为NaN
;
② 执行结果的第一列值是index
(索引,默认)
也可以创建Series
时,指定index
,比如:
s = pd.Series([1,2,3,np.nan,5,6],index=['a','b','c','d','e','f'])
示例-2 创建一个Series存储年龄数据
Series
存储了四个年龄:19/31/25/24,只需将要存储的数据构建成一个List
,然后赋值给data
参数即可。
user_age = pd.Series(data=[19, 31, 25, 24])
print user_age
#执行结果:
0 19
1 31
2 25
3 24
dtype: int64
示例-3 使Series的index有意义
可以通过 Series
的index
(索引)来为Series
中存储的数值赋予一定的含义。比如:年龄肯定是对应一个姓名。
user_age.index = ["xiaoming", "xiaohong", "xiaohei", "xiaobai"]
print user_age
#执行结果:
xiaoming 19
xiaohong 31
xiaohei 25
xiaobai 24
dtype: int64
示例-4 为Series的index起名字
现在姓名与年龄已经完全对应上了。但是别人不知道index代表的是姓名的含义,所以,需要为index
起个名字。
user_age.index.name = "name"
print user_age
#执行结果:
name
xiaoming 19
xiaohong 31
xiaohei 25
xiaobai 24
dtype: int64
示例-4 为Series起名字
就像我们给index
起名字一样,我们也可以给Series
起个名字。
user_age.name="user_age_info"
print user_age
#执行结果:
name
xiaoming 19
xiaohong 31
xiaohei 25
xiaobai 24
Name: user_age_info, dtype: int64
通过上面一系列的操作,我们对 Series
的结构上有了基本的了解,简单来说,一个Series
包括了 data
、index
以及 name
。
示例-5 完整演示上述零碎的知识点
# 构建索引
name = pd.Index(["xiaoming", "xiaohong", "xiaohei", "xiaobai"], name="name")
# 构建 Series
user_age = pd.Series(data=[19, 31, 25, 24], index=name, name="user_age_info")
print user_age
#执行结果:
name
xiaoming 19
xiaohong 31
xiaohei 25
xiaobai 24
Name: user_age_info, dtype: int64
示例-6 指定Series数据类型
上述示例中,我们并没有为 Series
指定元素的数据类型,这时,Pandas
会自动判断数据类型。
当然了,我们也可以自己手动指定数据类型。
# 指定类型为浮点型
user_age = pd.Series(data=[19, 31, 25, 24], index=name, name="user_age_info", dtype=float)
print user_age
#执行结果:
name
xiaoming 19.0
xiaohong 31.0
xiaohei 25.0
xiaobai 24.0
Name: user_age_info, dtype: float64
示例-7 获取Series中元素的方式[index]和get(index)
Series
包含了 dict
的特点,也就意味着可以使用与dict
类似的一些操作。我们可以将index
中的元素看成是 dict
中的key
。
# 获取 Tom 的年龄
user_age["xiaoming"]
#执行结果:
19.0
此外,可以通过get
方法来获取。通过这种方式的好处是当索引不存在时,不会抛出异常。
user_age.get("xiaoming")
#执行结果:
19.0
Series
除了像dict
外,也非常像 ndarray
,这也就意味着可以采用切片操作。
示例-8 获取Series中元素的方式-切片
# 获取第一个元素
user_age[0]
#执行结果:
19.0
# 获取前三个元素
user_age[:3]
#执行结果:
name
xiaoming 19.0
xiaohong 31.0
xiaohei 25.0
Name: user_age_info, dtype: float64
# 获取第4个和第二个元素
user_age[[3, 1]]
执行结果:
name
xiaobai 24.0
xiaohong 31.0
Name: user_age_info, dtype: float64
示例-9 获取Series中元素的方式-布尔
# 获取年龄大于30的元素
user_age[user_age > 30]
#执行结果:
name
xiaohong 31.0
Name: user_age_info, dtype: float64
可以看到,无论我们通过切片如何操作 Series
,它都能够自动对齐 index
。
示例-10 Series 的向量化操作
Series
与 ndarray
一样,也是支持向量化操作的。同时也可以传递给大多数期望 ndarray
的 NumPy
方法。
user_age + 1
#执行结果:
name
xiaoming 20.0
xiaohong 32.0
xiaohei 26.0
xiaobai 25.0
Name: user_age_info, dtype: float64
再比如:
np.exp(user_age)
2 利用pandas判断Series的空值null
pd.isnull(s)
pd.notnull(s)
3 Series自身判断空值null
s.isnull()
4 Series的简单方法
s = pd.Series([1,3,5,6],index=['a','b','c','d'])
s[s>5]
s*5