Pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。Pandas提供了大量能使我们快速便捷地处理数据的函数和方法。利用Pandas进行数据操作、预处理、清洗是Python数据分析中的重要技能。
数据被分为三部分:行索引(index),列索引(columns)及数据内容(data)
Series
Series是Pandas中最基本的对象,Series类似一种一维数组。事实上,Series 基本上就是基于 NumPy 的数组对象来的。和 NumPy 的数组不同,Series 能为数据自定义标签,也就是索引(index),然后通过索引来访问数组中的数据。
- 创建Series,使用默认索引
sel = Series(data=[1, 'lackychen', 30, 'a teacher and a student'])
一个Series其实就是一条数据,Series方法的第一个参数是data,第二个参数是index(索引),如果没有传值会使用默认值(0-N)。
- 创建Series,使用自定义索引
sel = Series(data=[1, 'lackychen', 30, 'a teacher and a student'], index = ['序号','姓名','年龄','评语'])
index参数是我们自定义的索引值,注意:参数值的个数一定要与元素个数相同。
- 将字典转换为Series
dic={"red":100,"black":400,"green":300,"pink":900}
se2=Series(data=dic)
当数据是字典的时候,会将字典的键作为索引,字典的值作为索引对应的数据值。
Series是一组带索引数组,与list相似,一般我们用其承装一条数据或者一行数据。多个Series可组成一个DataFrame。
- 通过values、index、items等Series的属性来获取各部分的全部数据
from pandas import Series
emp=['001','002','003','004','005','006']
name=['亚瑟', '后裔','小乔','哪吒' ,'虞姬','王昭君']
series = Series(data=name,index=emp)
# 获取数据的值
print(series.values)
# 获取索引的值
print(series.index.tolist())
# 获取每对索引和值
print(list(series.items()))
values、index、items返回的对象分别是List、Index、Zip类型的数据,为了方便我们使用和观察数据,可以使用series.index.tolist()和list(series.items())方法转化成List类型。
Series就像将索引值暴露在外面的List,其实它们除了外表相似以外,在获取数据方面也非常的相似。我们可以通过索引值来进行单个数据的访问,同样也支持切片选择多个数据。
from pandas import Series
emp=['001','002','003','004','005','006']
name=['亚瑟', '后裔','小乔','哪吒' ,'虞姬','王昭君']
series = Series(data=name,index=emp)
# 使用索引值获取单个数据
print(series['001'])
# 使用索引值获取多个不连续的数据
print('索引下标',series[['002','004']])
# 使用切片获取连续的数据
print('索引切片',series['001':'004'])
from pandas import Series
emp=['001','002','003','004','005','006']
name=['亚瑟', '后裔','小乔','哪吒' ,'虞姬','王昭君']
series = Series(data=emp,index=name)
# 使用位置下标获取单个数据
print(series[0])
# 使用位置下标获取多个不连续的数据
print('位置下标',series[[1,3]])
# 使用位置下标切片获取连续的数据
print('位置切片',series[0:3])
我们自定的index值被叫做索引下标,没有设置index值时会有一个默认的值叫做位置下标。
- 利用循环来遍历Series
直接遍历Series的值:
# 遍历并拿到data数据
for value in series:
print(value)
通过keys()遍历Series的索引:
# 遍历并拿到index数据
for index in series.keys():
print(index)
通过items()遍历Series的每对索引和数据:
# 遍历并拿到每对索引和数据
for item in series.items():
print(item)
DataFrame
DataFrame(数据表)是一种 2 维数据结构,数据以表格的形式存储,分成若干行和列。通过 DataFrame,你能很方便地处理数据。调用DataFrame()可以将多种格式的数据转换为DataFrame对象,它的的三个参数data、index和columns分别为数据、行索引和列索引。
- 二维列表创建dataframe
lol_list = [ ['上单','TheShy',20], ['打野','小天',19], ['中单','Faker',23], ['ADC','Uzi',22], ['辅助','Ming',21] ]
df = DataFrame(data=lol_list)
有没有办法在创建DataFrame对象的时候为每一列设定一个有意义的名字呢?我们可以通过给DataFrame构造函数中的参数index
,columns
传值来设定DataFrame的中的行、列索引的值。
- 二维列表创建dataframe,自定义index、columns
lol_list = [ ['上单','TheShy',20], ['打野','小天',19], ['中单','Faker',23], ['ADC','Uzi',22], ['辅助','Ming',21] ]
df = DataFrame(data=lol_list, index=['a','b','c','d','e'], columns=['位置','ID号','年龄'])
- 使用字典创建dataframe,字典的键值作为数据的列索引值
dic={ '位置': ['上单', '打野', '中单', 'ADC','辅助'], 'ID号': ['TheShy', '小天', 'Faker', 'Uzi', 'Ming'], 'year': [20, 19, 23, 22,21]}
df=pd.DataFrame(dic)
可以把 DataFrame 理解成一组采用同样索引的 Series 的集合。DataFrame处理数据常见的操作有选取、替换行或列的数据,重组数据表、修改索引、多重筛选等。
DataFrame里的数据是按照行和列来进行排列,如何对DataFrame的数据按照行或者列进行选择、遍历以及修改。在这之前我们要清楚DataFrame中的数据情况,首先数据的维度是一维还是二维的我们可以使用ndim查看,数据的行数和列数使用shape查看,行、列的索引值使用index、columns查看。
import pandas as pd
df_dict = {
'name':['ZhangSan','LiSi','WangWu','ZhaoLiu'],
'age':['18','20','19','22'],
'weight':['50','55','60','80']
}
df = pd.DataFrame(data=df_dict,index=['001','002','003','004'])
print(df)
# 获取行数和列数
print(df.shape)
# 获取行索引
print(df.index.tolist())
# 获取列索引
print(df.columns.tolist())
# 获取数据的维度
print(df.ndim)
数据量比较大并且我们想看数据的具体情况的时候,直接打印df比较耗时,所以我们可以只获取前几行或者后几行,了解数据的构成即可。这时候有两个法宝head()、tail()帮我们解决这个问题。
# 获取前两条
df.head(2)
# 获取后两条
df.tail(2)
两个方法都有默认值,默认值是5,当然也可以自己设置,如果数据不够5个会将全部数据拿出来。
# 通过位置索引切片获取一行
print(df[0:1])
# 通过位置索引切片获取多行
print(df[1:3])
# 获取多行里面的某几列
print(df[1:3][['name','age']])
# 获取DataFrame的列
print(df['name'])
# 获取多个列
print(df[['name','age']])
df[]不支持直接输入标签索引获取行数据,例如:df['001'];
这种方式可以获取一列数据,列如:df['name'];
如果想获取多行里面的某几列可写成:df[行][列],例如:df[1:3][['name','age']],将列索引值放到同一个列表中,再将列表放到第二个方括号中。
- 行标签索引筛选loc[],行位置索引筛选iloc[]:
import pandas as pd
df_dict = {
'name':['ZhangSan','LiSi','WangWu','ZhaoLiu'],
'age':['18','20','19','22'],
'weight':['50','55','60','80']
}
df = pd.DataFrame(data=df_dict,index=['001','002','003','004'])
print(df)
# 获取某一行某一列的数据
print(df.loc['001','name'])
# 某一行多列的数据
print(df.loc['001',['name','weight']])
# 一行所有列
print(df.loc['001',:])
# 选择间隔的多行多列
print(df.loc[['001','003'],['name','weight']])
# 选择连续的多行和间隔的多列
print(df.loc['001':'003','name':'weight'])
df.loc[] 通过标签索引获取行数据,它的语法结构是这样的:df.loc[[行],[列]],方括号中用逗号分隔,左侧是行、右侧是列。注意:如果行或者列使用切片的时候,要把方括号去掉,列df.loc['001':'003','name':'weight']。
df.iloc[] 通过位置索引获取行数据,他的操作和loc[]操作是一样的,只要将标签索引改成位置索引就好了。
# 取一行
print(df.iloc[1])
# 取连续多行
print(df.iloc[0:2])
# 取间断的多行
print(df.iloc[[0,2],:])
# 取某一列
print(df.iloc[:,1])
# 某一个值
print(df.iloc[1,0])
import pandas as pd
df_dict = {
'name':['ZhangSan','LiSi','WangWu','ZhaoLiu'],
'age':['18','20','19','22'],
'weight':['50','55','60','80']
}
df = pd.DataFrame(data=df_dict,index=['001','002','003','004'])
print(df)
print(df.iloc[1])
print(df.iloc[0:2])
print(df.iloc[[0,2],:])
print(df.iloc[:,1])
print(df.iloc[1:3,0:1])
print(df.iloc[1,0])
需要注意的是,loc和iloc的切片操作在是否包含切片终点的数据有差异。loc['001':'003']的结果中包含行索引003对应的行。iloc[0:2] 结果中不包含序号为2的数据,切片终点对应的数据不在筛选结果中。loc是指location的意思,iloc中的i是指integer。这两者的区别如下:
loc:works on labels in the index.
iloc:works on the positions in the index (so it only takes integers).
也就是说loc是根据index来索引,比如下边的df定义了一个index,那么loc就根据这个index来索引对应的行;iloc并不是根据index来索引,而是根据行号来索引,行号从0开始,逐次加1。
- dataframe数据遍历
iterrows(): 按行遍历,将DataFrame的每一行转化为(index, Series)对。index为行索引值,Series为该行对应的数据。
for index,row_data in df.iterrows():
print(index,row_data)
iteritems():按列遍历,将DataFrame的每一列转化为(column, Series)对。column为列索引的值,Series为该列对应的数据。
for col,col_data in df.iteritems():
print(col)
示例:
import pandas as pd
df_dict = {
'name':['ZhangSan','LiSi','WangWu','ZhaoLiu'],
'age':['18','20','19','22'],
'weight':['50','55','60','80']
}
df = pd.DataFrame(data=df_dict,index=['001','002','003','004'])
for index, row_data in df.iterrows():
print(index, row_data)
for col, col_data in df.iterrows():
print(col)
print(col_data)
网友评论