Series
Series类易于一维数组,包含值以及索引(index),最简单的Series可以由一个列表组成:
import pandas as pd
obj = pd.Series([1,-2,3,5])
print(obj)
#0 1
# 1 -2
# 2 3
# 3 5
# dtype: int64
假设一共有N个数据,则索引默认是从0开始到N-1,我们可以通过索引来访问其中的元素。我们可以使用Series的values和index属性来查看其值和索引:
print(obj.index)
#RangeIndex(start=0, stop=4, step=1)
print(obj.values)
#[ 1 -2 3 5]
我们也可以自定义一个索引序列,并通过索引或者索引列表其访问其元素:
obj = pd.Series([1,-2,3,5],index=['a','b','c','d'])
print(obj['a'])
#1
print(obj[0])
#1
print(obj[['a','b','c']])
print(obj[[0,1,2]])
# a 1
# b -2
# c 3
# dtype: int64
这里我们注意到也可以使用默认的index来访问内部的元素
类似于Numpy中的数组,Series也支持使用布尔索引,比如得到Series中大于2的元素:
print(obj[obj>2])
# c 3
# d 5
# dtype: int64
print(obj*2)
其数学运算也与Numpy中的数组类似:
print(obj*2)
# a 2
# b -4
# c 6
# d 10
# dtype: int64
我们可以使用字典来生成一个Series数据结构:
sdata = {'a':10,"b":20,"c":30,'d':40}
obj = pd.Series(sdata)
print(obj)
# a 10
# b 20
# c 30
# d 40
# dtype: int64
注意到Series的索引与字典中的索引相对应
与字典类似我们可以通过以下方式来判断Series中是否存在某一索引:
'a' in obj
#True
'f' in obj
#False
我们可以使用pandas中的isnull()和notnull()来检查缺失的数据,另外isnull和notnull也是Series的实例化方法,所以具体使用方法就有:
pd.isnull(obj)
pd.notnull(obj)
#pandas中的函数
obj.isnull()
obj.notnull()
#Series的实例化方法
Series的索引可以通过按位置幅值的方式改变:
obj = pd.Series([1,-2,3,5],index=['a','b','c','d'])
obj.index = ['e','f','g','h']
#将索引修改为e、f、g、h
DataFrame
DatraFrame表示的是矩阵的数据表,它既有行索引也有列索引,每一列可以是不同的值类型。最常用的构建DataFrame的方式是利用包含等长度列表或者Numpy数组的字典来构造DataFrame:
data = {'state':['O','O','O','N','N','N'],
'year':[2000,2001,2002,2001,2002,2003],
'pop':[1.5,1.7,3.6,2.4,2.9,3.2]}
frame = pd.DataFrame(data)
# state year pop
# 0 O 2000 1.5
# 1 O 2001 1.7
# 2 O 2002 3.6
# 3 N 2001 2.4
# 4 N 2002 2.9
# 5 N 2003 3.2
对于大型的DataFrame可以使用head方法显示前五行:
print(frame.head())
另外我们可以在构造DataFrame的时候指定列的顺序,也能自定义每一行的索引。如果传的值不包含在字典中,将出现缺失值:
data = {'state':['O','O','O','N','N','N'],
'year':[2000,2001,2002,2001,2002,2003],
'pop':[1.5,1.7,3.6,2.4,2.9,3.2]}
frame = pd.DataFrame(data,columns = ['year','state','pop','debt'],index = ['a','b','c','d','e','f'])
# year state pop debt
# a 2000 O 1.5 NaN
# b 2001 O 1.7 NaN
# c 2002 O 3.6 NaN
# d 2001 N 2.4 NaN
# e 2002 N 2.9 NaN
# f 2003 N 3.2 NaN
按列访问,可以得到一个Series的数据类型,有一下两种方式:
frame['year']
frame.year
# a 2000
# b 2001
# c 2002
# d 2001
# e 2002
# f 2003
# Name: year, dtype: int64
我们可以给某一列的任意个元素幅值,未被幅值的位置则会填充NAN,若赋值的列名不存在则会新建一个列:
val = pd.Series([-1.2,-1.5,-1.6],index = ['c','d','f'])
frame.debt = val
# year state pop debt
# a 2000 O 1.5 NaN
# b 2001 O 1.7 NaN
# c 2002 O 3.6 -1.2
# d 2001 N 2.4 -1.5
# e 2002 N 2.9 NaN
# f 2003 N 3.2 -1.6
可以使用del方法删除某一列,如:
del frame['debt']
这里需要注意一点,不能使用del frame.debt的形式来或删除列。也不能使用如frame.debt = val的形式来创建一个新列,另外从DataFrame中选取的Series是数据的视图而不是拷贝,这就意味着对Series所有的修改都会改变DataFrame中的数据
索引对象
索引对象一般用来储存轴标签或轴名称等元数据的,在构造DataFrame或者Series的时候使用的任意标签序列都可以从内部转化为索引对象,处于安全性考虑,索引对象被设置为不可修改:
frame = pd.DataFrame(data,columns = ['year','state','pop','debt'],index = ['a','b','c','d','e','f'])
index1 = frame.index
#Index(['a', 'b', 'c', 'd', 'e', 'f'], dtype='object')
index2 = frame.columns
#Index(['year', 'state', 'pop', 'debt'], dtype='object')
#标签序列转化为了索引对象
类似于集合,索引对象可以进行如下操作:
'year' in index2
#True
'name' in index2
#False
与python中的集合不同的是,索引对象中可以出现重复的标签,如果选择了具有重复的标签,则会选择到该标签对应的所有数据