数据分析如下所示共6步,而使用Python可以帮助我们完成前5步。
一. Pandas简介
Pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。Pandas提供了大量能使我们快速便捷地处理数据的函数和方法。
了解了Pandas的基本概念,再看一下Pandas在数据分析方面有哪些作用呢?
Pandas提供的数据结构和函数的设计,将使表格化数据的工作快速、简单、有表现力。所以利用Pandas进行数据操作、预处理、清洗是Python数据分析中的重要技能。
二. Pandas数据结构
常见的数据存储形式有Excel和数据库这两种,他们的存储有什么共同点呢?
Pandas的DataFrame的结构就和他们相同,Series的结构和表中的行的结构相同。
import pandas as pd
# 通过Series存储每个英雄的基本信息
# 创建Series
s1 = pd.Series([1001,'lily','18','150.00','female'])
s2 = pd.Series([1002,'lucy','20','170.00','female'])
s3 = pd.Series([1003,'tomy','22','176.00','male'])
s4 = pd.Series([1004,'lilei','23','178.00','male'])
series_list = [s1,s2,s3,s4]
# 创建一个DataFrame对象存储通讯录
df = pd.DataFrame(series_list)
# 打印df
print(df)
# 输出结果如下:
0 1 2 3 4
0 1001 lily 18 150.00 female
1 1002 lucy 20 170.00 female
2 1003 tomy 22 176.00 male
3 1004 lilei 23 178.00 male
我们根据df的打印结果进一步解析DataFrame的结构。
整个数据被分为三部分:行索引(index),列索引(columns)及数据内容(data)。
行、列索引的值在没有自定义的时候,会被默认设置上0-N的值,索引的作用就是为了更好的认知和查询数据。
可以看出每一列数据都是同种类型的数据,如果每一列设定一个有意义的名字,操作的时候就会更加方便。
三. Series的创建
Series是Pandas中最基本的对象,Series类似一种一维数组。事实上,Series 基本上就是基于 NumPy 的数组对象来的。和 NumPy 的数组不同,Series 能为数据自定义标签,也就是索引(index),然后通过索引来访问数组中的数据。
# 导入Series
from pandas import Series,DataFrame
# 创建Series,使用默认索引
se1 = Series(data=[1,'羞羞的尹志平','20','天生爱做色狼,杨过不喜欢他'])
print(se1)
# 输出结果:
0 1
1 羞羞的尹志平
2 20
3 天生爱做色狼,杨过不喜欢他
dtype: object
一个Series其实就是一条数据,Series方法的第一个参数是data,第二个参数是index(索引),如果没有传值会使用默认值(0-N)。
自定义一个索引看看。
# 导入Series
from pandas import Series,DataFrame
# 创建Series,使用自定义索引
se1 = Series(data=[1,'羞羞的尹志平','20','天生爱做色狼,杨过不喜欢他'],index=['序号','姓名','年龄','属性'])
print(se1)
# 输出结果:
序号 1
姓名 羞羞的尹志平
年龄 20
属性 天生爱做色狼,杨过不喜欢他
dtype: object
index参数是我们自定义的索引值,注意:参数值的个数一定要相同。
在创建Series时数据并不一定要是列表,也可以将一个字典传进去。
# 导入Series
from pandas import Series,DataFrame
# 将字典转换为Series
dic = {
'name':'小龙女','属性':'超级漂亮','年龄':'29','备注':'杨过的老婆'}
se2 = Series(data=dic)
print(se2)
# 输出结果:
name 小龙女
属性 超级漂亮
年龄 29
备注 杨过的老婆
dtype: object
当数据是字典的时候,会将字典的键作为索引,字典的值作为索引对应的数据值。
综上可以看出,Series是一组带索引数组,与list相似,一般我们用其承装一条数据或者一行数据。多个Series可组成一个DataFrame。
四. DataFrame的创建
DataFrame(数据表)是一种 2 维数据结构,数据以表格的形式存储,分成若干行和列。通过 DataFrame,能很方便地处理数据。
调用DataFrame()可以将多种格式的数据转换为DataFrame对象,它的的三个参数data、index和columns分别为数据、行索引和列索引。
# 导入Series
from pandas import Series,DataFrame
# 创建二维列表,存储人物信息
list = [['杨过','神雕大侠','善于使用独臂大刀'],
['小龙女','神雕大侠的妻子','善于使用神雕大侠的大刀'],
['尹志平','神雕大侠的妻子的仇人','善于使用神雕大侠的妻子']]
# 创建dataframe
df = DataFrame(data=list)
print(df)
# 输出结果:
0 1 2
0 杨过 神雕大侠 善于使用独臂大刀
1 小龙女 神雕大侠的妻子 善于使用神雕大侠的大刀
2 尹志平 神雕大侠的妻子的仇人 善于使用神雕大侠的妻子
list是使用一个二维列表,将每一个人物的信息存储到一个列表中。
调用DataFrame()将二维列表转换为DataFrame对象,行列索引使用的是默认0-N数字代表。
# 导入Series
from pandas import Series,DataFrame
# 创建二维列表,存储人物信息
list = [['杨过','神雕大侠','善于使用独臂大刀'],
['小龙女','神雕大侠的妻子','善于使用神雕大侠的大刀'],
['尹志平','神雕大侠的妻子的仇人','善于使用神雕大侠的妻子']]
# 创建dataframe
df = DataFrame(data=list,index=[1,2,3],columns=['姓名','称号','特长'])
print(df)
# 输出结果:
姓名 称号 特长
1 杨过 神雕大侠 善于使用独臂大刀
2 小龙女 神雕大侠的妻子 善于使用神雕大侠的大刀
3 尹志平 神雕大侠的妻子的仇人 善于使用神雕大侠的妻子
当然我们也可以使用字典来创建一个DataFrame数据。
# 导入Series
from pandas import Series,DataFrame
# 创建字典,存储人物信息
# list = [['杨过','神雕大侠','善于使用独臂大刀'],
# ['小龙女','神雕大侠的妻子','善于使用神雕大侠的大刀'],
# ['尹志平','神雕大侠的妻子的仇人','善于使用神雕大侠的妻子']]
dic = {
'姓名':['杨过','小龙女','尹志平'],
'称号':['神雕大侠','神雕大侠的妻子','神雕大侠的妻子的仇人'],
'特长':['善于使用独臂大刀','善于使用神雕大侠的大刀','善于使用神雕大侠的妻子']}
# 创建dataframe
df = DataFrame(dic)
print(df)
# 输出结果:
姓名 称号 特长
0 杨过 神雕大侠 善于使用独臂大刀
1 小龙女 神雕大侠的妻子 善于使用神雕大侠的大刀
2 尹志平 神雕大侠的妻子的仇人 善于使用神雕大侠的妻子
通过结果可以看出当字典格式的数据被dataframe整理后,字典的键将作为数据的列索引值。
五. Series常用属性与方法
表格数据中的每一列或者每一行的数据结构都是Series,它可以看成是一维的表格数据。
它可以属于DataFrame的一部分也可以作为一个独立的数据结构存在。
from pandas import Series
mp=['001','002','003','004','005','006']
name=['亚瑟', '后裔','小乔','哪吒' ,'虞姬','王昭君']
se = Series(data=name,index=mp)
# 获取数据的值
print(se.values)
print('-'*20)
# 获取索引的值
print(se.index.tolist())
print('-'*20)
# 获取每队数据与索引的值
print(list(se.items()))
# 输出结果:
['亚瑟' '后裔' '小乔' '哪吒' '虞姬' '王昭君']
--------------------
['001', '002', '003', '004', '005', '006']
--------------------
[('001', '亚瑟'), ('002', '后裔'), ('003', '小乔'), ('004', '哪吒'), ('005', '虞姬'), ('006', '王昭君')]
values、index、items返回的对象分别是List、Index、Zip类型的数据,为了方便我们使用和观察数据,可以使用series.index.tolist()和list(series.items())方法转化成列表类型。
Series就像将索引值暴露在外面的List,其实它们除了外表相似以外,在获取数据方面也非常的相似。我们可以通过索引值来进行单个数据的访问,同样也支持切片选择多个数据。
from pandas import Series
mp=['001','002','003','004','005','006']
name=['亚瑟', '后裔','小乔','哪吒' ,'虞姬','王昭君']
se = Series(data=name,index=mp)
# 使用索引获取单个数值
print(se['002'])
print('-'*20)
# 使用索引获取多个不连续的数值
print('索引下标')
print(se[['001','003','006']])
print('-'*20)
# 使用索引获取多个连续的数值
print('索引切片')
print(se['004':'006'])
# 输出结果:
后裔
--------------------
索引下标
001 亚瑟
003 小乔
006 王昭君
dtype: object
--------------------
索引切片
004 哪吒
005 虞姬
006 王昭君
dtype: object
注意:
- 获取数据格式—对象名[]
- 获取多个不连续数据时是双层括号— 对象名[[]]
- 使用切片时使用的是—对象名[:]
那么, 原来的默认索引去哪里了呢?其实还是存在的,并且可以使用。
我们自定的index值被叫做索引下标,没有设置index值时会有一个默认的值叫做位置下标。
from pandas import Series
mp=['001','002','003','004','005','006']
name=['亚瑟', '后裔','小乔','哪吒' ,'虞姬','王昭君']
se = Series(data=name,index=mp)
# 使用索引获取单个数值
print(se[0])
print('-'*20)
# 使用索引获取多个不连续的数值
print('位置下标')
print(se[[1,3,5]])
print('-'*20)
# 使用索引获取多个连续的数值
print('位置切片')
print(se[3:5])
# 输出结果:
亚瑟
--------------------
位置下标
002 后裔
004 哪吒
006 王昭君
dtype: object
--------------------
位置切片
004 哪吒