python 数据分析(pandas)

目录

1.Series的使用

        1.1使用列表作为数据源

        1.2使用数组作为数据源

        1.3使用字典作为数据源

        1.4索引的使用

        1.5使用name给数据序列起别名

        1.6常用属性

        1.7索引取值

        1.8三种遍历方式遍历

2.DataFrame的使用

        2.1参数使用

        2.2字典作为一个数据源

        2.3获取行列索引的列表

        2.4获取头尾数据的函数

        2.5查看数据的维度和行列数

        2.6数据的筛选及遍历

3.数据保存在文件中

4.读取文件数

4.数据的删除及空值处理

        4.1删除某行某列

        4.2空值处理

        4.3移除重复数据

   5.数据的合并及筛选

        5.1数据合并

        5.2数据的筛选

        5.3数据的排序

        5.4数据的分组

6.多层索引的使用

        6.1Series多层索引使用

        6.2DataFrame多层索引使用

        6.3多层索引的排序

7.datetime模板的使用

7.1获取当前时间

7.2datetime类型转换成字符串类型

7.3字符串类型转换成datetime类型

7.4pandas时间序列的基础


        概述:在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()

  • 7
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱笑的蛐蛐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值