1.1pandas介绍
它含有使数据清洗和分析⼯作变得更快更简单的数据结构和操作⼯具。pandas经常和其它⼯具⼀同使⽤,如数值计算⼯具NumPySciPy,分析库 statsmodels和scikit-learn,和数据可视化库matplotlib。pandas是基于NumPy数组构建的,特别是基于数组的函数和不使⽤for循环的数据处理。
Pandas是专⻔为处理表格和混杂数据设计的。
1.2 常用数据结构:Series和DataFrame
引入本地命名空间:
import pandas as pd
from pandas import Series,DataFrame
1.2.1 Series
Series是个定长的字典序列。说是定长是因为在存储的时候,相当于两个ndarray,这也是和字典结构最大的不同。因为在字典的结构里,元素的个数是不固定的。
种类似于⼀维数组的对象,它由⼀组数据(各种NumPy数据类型)以及⼀组与之相关的数据标签(即索引)组成。
obj=pd.Series([4,7,-5,3])
print(obj)
#返回
0 4
1 7
2 -5
3 3
dtype:int64
Series的字符串表现形式为:索引在左边,值在右边,由于上面代码没有为数据指定索引,于是会自动创建一个0到N-1的整数型索引。
#也可以通过Series的values属性和index属性获取其数组表示形式和索引对象
print(obj.values)
#结果为
array([4,7,-5,3])
print(index)
#结果为,此为未指定索引情况下的默认定义
RangeIndex(start=0,stop=4,step=1)
#接下来自定义index
x1=Series(data=[1,2,3,4],index=['a','b','c','d'])
print(x1)
a 1
b 2
c 3
4 4
dtype:int64
#使用索引选取组值或赋值就不做说明了
#对Series使用Numpy函数或类似Numpy的运算(加减乘除,应用数学函数等)不做说明
#采用字典方式创建Series
d={'a':1,'b':2,'c':3,'d':4}#先定义一个字典
x2=Series(d)
print(x2)
a 1
b 2
c 3
d 4
dtype:int64
print(x2.index)#查看x2的index
Index(['a','b','c','d'],dtype='object')
a=['c','d','a','e']
x3=pd.Series(d,index=a)
print(x3)
c 3.0
d 4.0
a 1.0
e NaN
dtype:float64
#d中与a索引相匹配的三个值会被找出并放到相应的位置上,但由于e所对应的的d值找不到,结果为NaN(即非数字,在pandas中,它用于表示确实或NA值)
#pandas的isnull和notnull函数用于检测缺失数据
pd.isnull(a)#notnull同理
c True
d False
a False
e False
dtype:bool
pandas的isnull和notnull函数会在处理缺失值时用到,后续会继续补充…
对于许多应用而言,Series最重要的一个功能是:会根据运算的索引标签自动对齐数据:
print(x2)
a 1
b 2
c 3
d 4
dtype:int64
print(x3)
c 3.0
d 4.0
a 1.0
e NaN
dtype:float64
print(x2+x3)
a 2.0
b NaN
c 6.0
d 8.0
e NaN
dtype: float64
#数据对齐功能在后面会详细补充....
Series对象本身及其索引都有一个name属性,该属性跟pandas其他关键功能关系非常密切,要了解
x3.name='number'
x3.index.name='letter'
print(x3)
c 3.0
d 4.0
a 1.0
e NaN
Name:number,dtype:float64
1.2.2 DataFrame
DataFrame是⼀个表格型的数据结构,它含有⼀组有序的列,每列可以是不同的值类型(数值、字符串、布尔值等)。DataFrame既有⾏索引也有列索引,它可以被看做由Series组成
的字典(共⽤同⼀个索引)。DataFrame中的数据是以⼀个或多个⼆维块存放的(⽽不是列表、字典或别的⼀维数据结构)。有关DataFrame内部的技术细节远远超出了本书所讨论的范围。虽然DataFrame是以⼆维结构保存数据的,但你仍然可以轻松地将其表示为更⾼维度的数据(层次化索引的表格型结构,这是pandas中许多⾼级数据处理功能的关键要素.
#创建DataFrame,最常用的一种是直接传入一个由等长列表或Numpy数组组成的字典
data={'state':'Ohio','Ohio','Necada'],
'year':[2000,2001,2002],
'pop':[1.5,1.7,3.6]}
frame=pd.DataFrame(data)
#DataFrame会自动加上索引,且全部列会被有序排列
print(frame)
pop state year
0 1.5 Ohio 2000
1 1.7 Ohio 2001
2 3.6 Necada 2002
#对于特别大的dataFrame,head()方法会选取前五行,如果制定了列序列,则会按照指定顺序进行排列输出,如果传入的列在数据中找不到,会在结果中产生缺失值
#通过类似字典标记的方式或属性的方式,可以将DataFrame的列获取为一个Series
print(frame['state'])
0 Ohio
1 Ohio
2 Necada
Name:state,dtype:object
#注意返回的Series拥有元DataFrame相同的索引,且其name属性也已经被相应的设置好了
#行的获取,可以使用loc属性
print(frame.loc[1])
pop 1.7
state Ohio
year 2001
Name:1,dtype:object
#列可以通过赋值的方式进行修改, 将列表或数组赋值给某个列时,其长度必须跟DataFrame的长度相匹配。如果赋值的是一个Series,就会精确匹配DataFrame的索引,所有的空位都会被填上缺失值。
#为不存在的列赋值会创建出一个新的列。关键字del用于删除列
frame['eastern']=frame.state=='Ohio'#创建一个列表示地区是否等于Ohio
print(frame)
pop state year eastern
0 1.5 Ohio 2000 True
1 1.7 Ohio 2001 True
2 3.6 Necada 2002 False
del(frame['eastern'])
通过索引⽅式返回的列只是相应数据的视图⽽已,并不是副本。因此,对返回的Series所做的任何就地修改全都会反映到源DataFrame上。通过Series的copy⽅法即可指定复制列。
#另一种厂家的数据形式是嵌套字典
pop={'Nevada':{2001:2.4,2001:2.9},
'Ohio':{2000:1.5,2001:1.7,2002:3.6}}#如果指明,内层函数的键会被合并排序以形成最终的索引,也可以通过index属性来指明
frame2=pd.DataFrame(pop)
print(frame2)
Nevada Ohio
2000 NaN 1.5
2001 2.4 1.7
2002 2.9 3.6
#可以使用类似Numpy数组的方法对DataFrame进行转置
print(frame2.T)
2000 2001 2002
Nevada NaN 2.4 2.9
Ohio 1.5 1.7 3.6
举个例子,虚拟一个王者荣耀考试的场景,想要输出几位英雄的考试成绩
import pandas as pd
from pandas import Series, DataFrame
data = {'Chinese': [66, 95, 93, 90,80],
'English': [65, 85, 92, 88, 90],
'Math': [30, 98, 96, 77, 90]}
df1= DataFrame(data)
df2 = DataFrame(data, index=['ZhangFei', 'GuanYu', 'ZhaoYun', 'HuangZhong', 'DianWei'], columns=['English', 'Math', 'Chinese'])
print(df2)
English Math Chinese
ZhangFei 65 30 66
GuanYu 85 98 95
ZhaoYun 92 96 93
HuangZhong 88 77 90
DianWei 90 90 80