目录
概述:在pandas中有两个数据序列是常用的数据结构,分别是Series和DataFrame,Series是表格中的一行或一列,表示一维数组,可以作为DataFrame数据序列中的数据进行使用,DataFrame是表格中的多行多列,是二维数组。
1.Series的使用
函数:Series(data,index,dtype,name,copy)
参数说明:data:表示输入的数据,可以是列表,常量,数组,如果是字典会保持参数顺序
index:表示索引值,可以自己定义
dtype:表示数据类型,自定义
name:可以为Series数据定义名称
copy:表示对数据data的拷贝
1.1使用列表作为数据源
# 列表作为数据创建Series
list_1 = [1, 34, 4, 2, 6]
print(type(list_1))
# 使用列表创建Series
s1 = pd.Series(list_1)
1.2使用数组作为数据源
# 使用数组作为数据源
np_rand = np.arange(1, 6)
# 使用数组创建Series
s2 = pd.Series(np_rand)
1.3使用字典作为数据源
当字典作为数据源时,key值全部为非数值型,不仅可以key值作为索引值,也可以使用标签作为索引值,如果key中有数值,就不能使用下标
# 字典作为数据源创建Series
dict_1 = {'a': 1, 'b': 2, 'c': 3}
s3 = pd.Series(dict_1)
1.4索引的使用
data = np.array(['a', 'b', 'c', 'd'])
# 自定义索引值
s4 = pd.Series(data, index=[100, 101, 102, 103])
1.5使用name给数据序列起别名
# 使用name给Series数据起一个列名
data2 = {'beijing': 100, 'wuhan': 120, 'guandong': 200}
s7 = pd.Series(data2)
s7.name = '数据' # 给数据起名字
s7.index.name = '城市' # 给索引起名字
1.6常用属性
1.values:获取数据的值,返回array类型
2.index:获取索引的值,返回index类型,to_list可以转换成列表
3.items:获取每对索引和数据,返回zip类型,使用list转换成列表
使用方式都是:数据对象.属性
1.7索引取值
# 使用索引下标取值
S[['001', '002']]
# 使用切片取值(和列表的一样)
S['002':'005':2]
1.8三种遍历方式遍历
# 遍历拿到data数据
for value in S:
print(value)
# keys:遍历拿到index值
for value in S.keys():
print(value)
# 遍历拿到每队索引和数据
for value in S.items():
print(value)
2.DataFrame的使用
函数:DataFrame(data,index,columns)
参数说明:1.data:表示数据序列
2.index:表示行索引
3.columns:表示列索引
2.1参数使用
df2 = DataFrame(data=lol_list,index=('a','b','c','d','f'), columns=['位置','Id号','年龄']) # 使用()
2.2字典作为一个数据源
dic = {
'位置': ['上单', '打野', '中单', 'ABC', '辅助'],
'ID号': ['t1', 't2', 't3', 't4', 't5'],
'年龄': [20, 21, 22, 23, 24]
}
df4 = DataFrame(data = dic) # key会作为列索引
2.3获取行列索引的列表
# df4.index.tolist():获取行索引列表
df4.index.tolist()
# df4.columns.tolist():获取列索引列表
df4.columns.tolist()
2.4获取头尾数据的函数
# df4.head(2):获取前两条,df4.tail(2):获取后两条
df4.head(2)
2.5查看数据的维度和行列数
# df4.ndim:查看维度
df4.ndim
# df4.shape:查看行列数
df4.shape
2.6数据的筛选及遍历
loc:按照行标签进行筛选
iloc:按照行位置进行筛选
遍历有三种方法
1.直接使用 数据对象[索引值]
2.iterrows:按行进行遍历
3.iteritems:按列进行遍历
# loc[]:筛选出某一行某一列数据
df4.loc[2, '年龄']
# loc[]:筛选某一行多列数据
df4.loc[3, ['位置', '年龄']]
# loc[]:取出某一行数据
df4.loc[4,:] # 加逗号和不加逗号是有区别的
# loc[]:取出多行多列
df4.loc[[2, 4], ['位置', '年龄']]
# loc[]:选择连续的多行多列
df4.loc[2:4,'位置':'年龄']
# iloc[]:按行位置进行索引,获取单行
df4.iloc[0] # 第0行位置
# 取得连续行数据
df4.iloc[0:2]
# 取得间隔行数据
df4.iloc[[0,2],:]
# df4.iterrows():按行遍历
for index, row in df4.iterrows(): # index:拿到行索引值,row:拿到行数据
print(index, row)
# iteritems():按列索引
for column, data_column in df4.iteritems(): # column:对应列索引
print(column, data_column)
3.数据保存在文件中
函数:to_csv(path_or_buf,index,encoding)
参数说明:
1.永久性保存,支持的格式有HTML、CSV、JSON、Excel
2.to_csv()的path_or_buf参数:需要指定文件的本地路径
3.to_csv()的index参数:设置为False就可以不存储DataFrame的行索引信息
4.to_csv()的encoding参数:设置“utf_8_sig”解决文件打开后乱码
##使用
# 路径
df.to_csv(path_or_buf="./info1.csv", index=False, encoding="utf_8_sig")
4.读取文件数
函数:read_csv(),read_excel()
参数说明
1.使用read_csv(),read_excel()等方法读取
2.read_csv()第一个参数填文件路径
3.默认会将文件中的第一行作为数据的列索引,使用header参数设置(指定位置索引,默认为None)
4.一个Excel文件可以存多个表,一个csv只有一个表
5.读取某个表时,使用sheet_name指定
##使用
pd.read_excel(path1, sheet_name='Sheet2')
4.数据的删除及空值处理
4.1删除某行某列
函数:drop(label=None,axis=0,index=None,inplace=False)
参数解释:
label:指定要删除的行列的名字,用列表给定
axis:有0/1两个值,0表示删除行,1表示删除列,默认是0
index:指定要删除的行
columns:指定要删除的列
inplace:是否在当前数据修改:True修改原数据,不会返回值,False返回一个新值
## 使用
# 删除某行,axis控制
pd1.drop(labels=[2,3],axis=0,inplace=True)
# 删除列
pd1.drop(labels="课程名称",axis=1, inplace=True)
4.2空值处理
函数:dropna()参数和drop一样
说明:
1.dropna():只要含有NaN的整行数据都删掉
2.参数how='all',删除整行都是空值的数据
3.axis:0表示行,1表示列
4.thresh:保留至少有n个非NaN数据的行
##使用
df = pd2.dropna() # 直接删除有空值的行
函数:fillna(n)
说明:把所有空的数据填满,n表示需要填充的数据
ffill方法:在fillna中 value和method不能同时出现
##使用
df2 = pd3.fillna(3) # 空值会被自动填满
# ffill方法使用
df5 = pd4.fillna(method='ffill',axis=0) # 把上一列的或前一行的数据自动填充到空值处
4.3移除重复数据
1.duplicated()检测数据是否为重复数据,重复则返回一个True
2.通过DataFrame的duplicated()去除重复行数据
3.drop_duplicates([])只判断某一列数据中是否重复 ,有会删除后面的重复数据
##使用
# duplicated() 可以返回每一行 判断是否重复的结果,重复则为False
df5.duplicated()
# drop_duplicated() 去除重复数据
df6 = df5.drop_duplicates([1], inplace=False) # [1]指对比 1 这一列中是否有重复,有则删除后面重复的行
5.数据的合并及筛选
5.1数据合并
函数:concat([],axis,join,ignore_index)
参数说明:
1.concat沿一个轴将多个DataFrame对象连接在一起
2.axis参数值:0表示行,1表示列
3.join参数:outer并集处理,inner交集处理
4.ignore_index=True:如果两个表index没有实际含义,使用该参数会重新整理一个index
##使用
# 对每个列进行了并集处理,当axis=0时,纵向拼接,是两个表的列对接列并集,缺失数据用空值填充
pd.concat([pd1,pd2],axis=0,join='outer',ignore_index=True)
# 对每个行进行了处理,当axis=1时,横向拼接,两个表的行对接行并集
pd.concat([pd1,pd2],axis=1,join='outer',ignore_index=True)
# 对每个相同的列进行处理,当axis=0时,两个表相同列名称的对接(交集)
pd.concat([pd1,pd2],axis=0,join='inner',ignore_index=True)
函数:merge()
1.merge方法通过指定连接键拼接列数据
2.how:连接方法,有inner()交集,left(表示向在左边的表看齐,并集),right(表示向在右边的表看齐,并集),outer(并集),默认为inner
3.on:指的是用于列索引的名称,必须存在于左右两个DataFrame中,如果没有指定且其它的参数也没有指定,则以两个DataFrame列名交集作为连接键
##使用
# 当使用outer连接,并且只用两个表都有的列名作为键,最终输出的数据是两个列的并集,缺失的内容由NaN填充
pd.merge(pd3,pd4,how='outer',on=['key'])
# 使用left连接时,即使用了参数表中左边的数据作为标准,合并后是两个数据的列数据
pd.merge(pd3,pd4,how='left',on=['key'])
# 使用right连接时,即使用了参数表中右边的数据作为标准,合并后是两个数据的列数据
pd.merge(pd3,pd4,how='right',on=['key'])
5.2数据的筛选
在DataFrame数据中是支持使用bool表达式进行数据的筛选的:如
1.df['列名']>100,返回每一行是否符号该条件的bool类型的Series
2.df[bool1 & bool2],如果多个条件可以使用逻辑运算符进行连接
# 该列大于100的行会返回True,不大于的返回False
df1['考号']>100
# 逻辑运算进行拼接
df3 = df1[bools & bools1]
5.3数据的排序
对数据的排序,在DataFrame中提供了两个方法,sort_index()和sort_values()
说明:
1.sort_index():按照行索引进行排序
2.sort_values():指定具体列进行排序
3.sort_values()的by参数:决定了按数据中的哪一列进行排序
4.ascending=False:将数据按照从大到小的顺序排序,默认True,升序
5.inplace:用来控制是否直接对原始数据进行修改
##使用
# 降序排序
pd5.sort_values(by='考号', ascending=False)
5.4数据的分组
分组的方法:
1.使用groupby()方法进行分组
2.group.size()查看分组后每组的数据
3.group.groups查看分组情况
4.group.get_group()根据分组后的名字选择分组数据
分组的使用
# 使用groupby进行分组
group = pd1.groupby('性别')
# 查看分组每一组的数据大小
group.size()
# 查看分组后每一个组的索引值,返回的是一个字典
group.groups
# 根据分组后数据的名称来拿出每一行数据
group.get_group('女')
# 只对一列数据进行分组
# 先取出名为 姓名 的列数据,在对齐进行分组
group1 = pd1['姓名'].groupby(pd1['课室'])
分组中函数的使用
在分组中是支持通用函数的使用的,如平均值mean,最大值max, 最小值min,和sum等
# 求平均值
m_group['课室'].mean()
# 求最大值
m_group['课室'].max()
# 求最小值
m_group['课室'].min()
对分组进行遍历
1.使用for in可以对分组后的对象进行遍历
2.遍历时可获取到两个对象,分组后的名字和对应组的数据
# 在这个遍历中group3_name是分组的组别,group3_data是分组中每一行的数据
for group3_name,group3_data in group3:
print(group3_name, group3_data)
对多列进行分组
1.使用 groupby 方法进行多列分组
2.将多个列名放入到列表中传给groupby做参数
3.分组后的数据会有多层索引,获取数据需要从外到里逐层获取
# 按照班级名称和性别分组,需要放入到列表中
group4 = pd1.groupby(['班级名称','性别'])
分组后的数据统计
1. pandas提供的常用函数
2.agg聚合函数,传入sum等系统提供的函数时,需要以字符串形势,自定义的传入函数名,多个时以列表形式传入
group5 = pd1.groupby('性别')
for group5_name,group5_data in group5:
# 按列表进行传入,返回对应数值的列表
result = group5_data['课室'].agg(['mean','max','min'])
# print(result)
print('{}组,平均值{:.2f},最大值{},最小值{}'.format(group5_name,result[0],result[1],result[2])) # 取出数据
6.多层索引的使用
6.1Series多层索引使用
1.创建
data = [1, 2, 3, 4, 5, 6]
# 多层索引的数据,使用一个列表嵌套
index = [
['a', 'b', 'c', 'd', 'e', 'f'],
['g', 'h', 'i', 'j', 'k', 'l']
]
seri = pd.Series(data = data,index = index)
2.取值
# 使用索引取值时只能先使用第一层索引,第二层索引可用可不用
# 索引层层递进来拿到想要的数据
seri['张三', '前期']
seri[:,'前期']
# 使用loc和iloc进行获取数据
# loc[]:行标签索引
# iloc[]:行位置索引
seri.loc['张三']
6.2DataFrame多层索引使用
1.创建
# 第一种方法:使用列表嵌套创建索引数据
import pandas as pd
import numpy as np
# 随机生成6行3列的数据
data = np.random.randint(0,100,size=(6,3))
# 行索引创建
index = [
['张三','张三','李四','李四','王五','王五'],
['前期','前期','后期','后期','中期','中期']
]
# 列索引创建
column = ['a', 'b', 'c']
df = pd.DataFrame(data = data, index = index, columns = column)
# 第二种方法:使用pandas.MultiIndex.from_product() 进行创建
import pandas as pd
import numpy as np
data = np.random.randint(0,100,size=(6,3))
name = ['张三', '李四', '王五']
exam = ['期中','期末']
column = ['java', 'web', 'python']
# 这样使用可以达到和上面的一样的效果
index = pd.MultiIndex.from_product([name,exam]) #这个列表中,谁在前,谁就是第一层索引
df1 = pd.DataFrame(data = data,index = index, columns = column)
2.取值
# 推荐使用loc[]索引
# iloc[]不受多索引影响,使用位置索引
# 使用loc方法获取数据,这里拿到该行的所有列数据
df1.loc['张三','期中']
# 步骤分解 需要把多层索引变成一层索引才可以使用,拿到该行的所有列数据
df1.loc['张三'].loc['期中']
# 切片方式
df1.loc[('张三','期中'),:]
6.3多层索引的排序
1.使用sort_index()排序
2.level()参数可以指定是否按指定的层级进行排序
3.第一层索引值为0,第二层索引值为1
4.ascending参数可以指定升降序排序,True为升序,False为降序
# 默认索引排序会把所有的层级进行排序
df2.sort_index()
# 使用level参数排序
df2.sort_index(level=0,ascending=False)
7.datetime模板的使用
1.使用datetime模块构建时间和日期函数
2.datetime常用类:date(日期),time(时间),datetime(日期和时间)
3.strftime将datetime类型转换成字符串
4.strptime将字符串类型转换成datetime类型
##日期date类型的使用
import datetime
date = datetime.date(2022,10,2)
print(date)
# 取出年
date.year
# 取出月
date.month
# 取出日
date.day
##时间time类型的使用
import datetime
time = datetime.time(16,46,30)
print(time)
# 拿到小时
time.hour
# 拿到分钟
time.minute
# 拿到秒
time.second
##datetime类型的使用和上面的一样
import datetime
datetime = datetime.datetime(2022,10,2,16,52,30)
# 取值和date,time类型十一样的
7.1获取当前时间
import datetime
datetime.datetime.now()
7.2datetime类型转换成字符串类型
使用到strftime方法
str_time = str(datetime) # 转换成字符串
# 将时间转换成想要的格式 转换成 日/月/年 时/分/秒
new_datetime = datetime.strftime('%d/%m/%Y %H:%M:%S')
7.3字符串类型转换成datetime类型
使用到strptime方法
import datetime
datetime = datetime.datetime.strptime('Oct-17-22 17:19','%b-%d-%y %H:%M') # 月份是%b
7.4pandas时间序列的基础
1.使用date_range创建出一个日期范围
2.将时间设置成数据的索引
3.to_datetime将字符串形式的日期转换成时间格式
参数说明:
# date_range():
# start:日期范围的开始
# end:日期范围的结束
# periods:固定日期的个数
# freq:日期的偏移量,默认是'D',表示一天为偏移量
# 四个参数中只能指定三个
import pandas as pd
date = pd.date_range(start='20220801',end='20221002')
# 创建时间间隔为10天的时间序列
date2 = pd.date_range(start='20220801',end='20221002',freq='10D'
# 创建固定个数的时间序列
date3 = pd.date_range(start='20220801',end='20221002',periods=10)
在数据中索引和切片时间序列数据
# 取值
pd1['2021-1']
# 切片取值
pd1['2021-2-25':'2021-3-3']
注意:使用该方式进行索引需要datetime类型的数据格式
to_datetime改变时间格式
1.pd.to_datetime(arg,format=None),该方法把时间转换成时间戳(Timestamp)类型
2.arg:需要修改的数据
3.format:数据格式
4.to_pydatetime():把时间戳类型转换成datetime时间类型
# 字符串类型的时间 转换成一个时间戳 Timestamp
import pandas as pd
date1 = pd.to_datetime('2022-10-2 18:49:30')
# to_pydatetime函数可以将时间戳类型 Timestamp转换成datetime类型
date2 = date1.to_pydatetime() # 使用to_pydatetime函数转换后的时间才是pandas所使用的时间类型
# to_datetime将字符串的时间转换成时间戳类型
date3 = pd.to_datetime('2022年10月2日',format='%Y年%m月%d日')
print(type(date3))
# 再把时间戳类型转换成datetime类型
date4 = date3.to_pydatetime()