《利用python进行数据分析》读书笔记之pandas基础(一)

pandas数据结构

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中的集合不同的是,索引对象中可以出现重复的标签,如果选择了具有重复的标签,则会选择到该标签对应的所有数据

发布了14 篇原创文章 · 获赞 0 · 访问量 236

猜你喜欢

转载自blog.csdn.net/pnd237/article/details/104233779