数据分析-python模块5.21

昨日内容回顾

  • DataFrame数据概览

    index	获取行标签
    columns	获取列字段
    shape	获取行列数
    dtype	获取每一列存储的数据的数据类型
    T		转置(行列互换顺序)
    head()	获取表格数据的前几行内容
    tail()	获取表格数据的后几行内容
    describe()	快速统计
    info()		查看数据类型及是否含有缺失数据
    
  • 读取外部数据

    # 常见参数
    	sep
        header
        names
        skiprows
        skipfooters
        usecols
        converters
        ...
    
    read_csv	文本文件和.csv文件
    
    read_excel	.xlsx文件
    
    read_sql	MySQL表数据
    	pymysql模块
        SQL语句
       
    # 如何在notebook环境中执行下载模块的命令
    	!pip3 install 模块名
        !conda install 模块名
    
  • 列操作

    # 重命名
    df.rename(column={'旧字段''新字段'})
    # 查看
    df['列字段名称']
    # 新增
    df['新字段名称'] = '统一的数据'
    df['新字段名称'] = ['对应个数的数据']
    df['新字段名称'] = df['旧字段数据1'] * df['旧字段数据2']
    df.insert(索引位置,...)
    # 删除
    del df['旧字段']
    
  • 行操作

    df['旧字段'] = 新数据
    
  • 列表生成式

    old_list = [11,22,33,44,55,66]
    new_l1 = [i+1 for i in old_list]
    new_l1 = [i+1 for i in old_list if i > 38]
    

今日内容概要

  • 作业讲解
  • 数据操作
  • 各种数据类型的处理
  • 数据的汇总
  • 数据的合并
  • pandas模块总结(结束)

今日内容详细

作业讲解

1.利用read_excel完成
	df5 = pd.read_excel(r'data_test06.xlsx',
                    skiprows=5,
                    usecols=['ID','Name','isRun','Date']
                   )
	df5
    # 需求分析
    df5.describe()	快速统计
    
    # 针对ID自动递增填充
    df5['ID']
    len(df5['ID'])
    # 方式1
    id_list = []
    for i in range(len(df5['ID'])):
        id_list.append(i+1)
    df5['ID'] = id_list
    # 方式2
    "列表生成式"
    df5['ID'] = [i+1 for i in range(len(df5['ID']))]
    # 方式3
    for i in df5.index:
        df5['ID'].at[i] = i + 1 # at[行索引]获取id字段对应数据
        
    # 针对isRun自动交替变换
    for i in df5.index:
        if i%2 == 0:
            df5['isRun'].at[i] = 'Yes'
        else:
        	df5['isRun'].at[i] = 'No'
     
    # 利用二元表达式的优化
     for i in df5.index:
        df5['isRun'].at[i] = 'Yes' if i%2 == 0 else 'No'

二元表达式

# 当if判断只用在二选一的情况下 我们可以使用更加简单的书写方式
# 二元表达式
res = 11 if 1>0 else 222
'if条件成立则使用if前面的值 不成立则使用else后面的值'

日期的递增操作

from datetime import date,timedelta
date		获取日期(年月日)
timedelta	时间差值
d = date(2020,11,11)	# 自定义时间
# 三天之后
d + timedelta(days=3)

ctime = date.today() # 获取今天日期
ctime

# 日递增
current_time = date.today()
for i in df5.index:
    df5['Date'].at[i] = current_time + timedelta(days=i)
    
# 月递增
def add_month(d,md):  # 该函数可以反复使用
    '''自动帮你校验当前月份并自动重置'''
    yd = md//12
    m = d.month + md%12
    if m!= 12:
        yd += m // 12
        m = m % 12
    return date(d.year+yd,m,d.day)
for i in df5.index:
    df5['Date'].at[i] = add_month(current_time,i)
    
# 年递增
for i in df5.index:
    df5['Date'].at[i] = date(current_time.year+i,current_time.month,current_time.day)
    
'''由于NaN为浮点型,可以在读取数据时,先将NaN转换成str
dtype={'ID':str,'isRun':str,'Date':str}
'''

数据筛选

# 获取指定列的数据
# 1.获取汽车品牌和新车价格		select Brand,New_price from sec_car;
# 单列
df4['Brand']
df4['列名']
# 多列 需要嵌套
df4[['Brand','New_price']]
df4[['列名1','列名2']]

# 获取指定数据
# 2.获取Discharge为国四的汽车数据		select * from sec_car where Discharge = '国4';
df4[df4['Discharge']=='国4']

# 获取满足多个条件的数据
# 3.获取品牌是DS并且Discharge为国5的汽车数据		
select * from sec_car where Brand = 'DS' and Discharge = '国5';
df4[(df4['Brand']=='DS') & (df4['Discharge'] == '国5')]

# 获取满足某个条件的数据
# 4.获取品牌是众泰或者二手车价格在15万以上的车
select * from sec_car where Brand ='众泰' or Sec_price >15;
df4[(df4['Brand'] == '众泰') | (df4['Sec_price'] > 15)]

# 获取满足部分条件的部分数据
# 5.获取品牌是众泰或者二手车价格在15万以上的车的Name和New_price
select Name,New_price from sec_car where Brand ='众泰' or Sec_price >15;
df4.loc[(df4['Brand'] == '众泰') | (df4['Sec_price'] > 15),['Name','New_price']]
'''如果针对筛选出来的数据 还需要指定字段名称 则需要使用loc方法'''

数据处理

# 1.将Boarding_time由原来的字符串类型转换成日期类型
pd.to_datetime(df4['Boarding_time'],format='%Y年%m月')
"""
日期习惯的符号
Y	年
m	月
d	日
H	时
M	分
S	秒
"""
df4['Boarding_time'] =
pd.to_datetime(df4['Boarding_time'],format='%Y年%m月')

# 2.将New_price由原来的字符串转换成数字类型
df4['New_price'].str[0:-1]  # 获取除最后一个字符,切割字符串数据 需要加str方法
df4['New_price'].str[0:-1].astype(float)  
# astype用于数据类型的转换
# dtypes和info()查看数据类型

# 3.去重	select distinct id from user;
df5.duplicated()	# 判断是否含有重复数据
df5[df5.duplicated()]	# 获取重复数据
df5.drop_duplicates()	# 直接删除重复的数据

异常值识别与处理

异常值识别与处理:
    1.Z得分法
    2.分位数法
    3.距离法

缺失值处理

缺失值的识别与处理
	1.df.isnull
    2.df.fillna
    3.df.dropna
    
data05 = pd.read_excel(r'data_test05.xlsx')
data05.head()
data05.isnull() # 统计每个数据项是否有缺失
data05.isnull().any(axis = 0) # 统计列字段下是否含有缺失

data05.isnull().sum(axis = 0) # 计算缺失值的数量
# 计算各列数据的缺失比例
data05.isnull().sum(axis = 0)/data05.shape[0]
data05.dropna()

data05.fillna(value=0) # 将所有的缺失值填充为0(不合理)
# 针对不同的缺失值使用合理的填充手段
data05.fillna(value = {
  'gender':data05.gender.mode()[0],  # 众数:可以有一个也可能是多个
  'age':data05.age.mean(),  # 平均值
  'income':data05.income.median()  # 中位数
}, inplace = True)

数据汇总

# 透视表功能
pd.pivot_table(data, values=None, index=None, columns=None,
              aggfunc = 'mean',fill_value = None,margins= False,
              dropna = True,margins_name = 'All')

data:指定需要构造透视表的数据集 
values:指定需要拉入“数值”框的字段列表
index:指定需要拉入“行标签”框的字段列表 
columns:指定需要拉入“列标签”框的字段列表 
aggfunc:指定数值的统计函数,默认为统计均值,也可以指定numpy模块中的其他统计函数 
fill_value:指定一个标量,用于填充缺失值 
margins:bool类型参数,是否需要显示行或列的总计值,默认为False 
dropna:bool类型参数,是否需要删除整列为缺失的字段,默认为True 
margins_name:指定行或列的总计名称,默认为All
    
data06 = pd.read_csv(r'diamonds.csv')
data06.head()

pd.pivot_table(data06, index = 'color',values='price',aggfunc='mean')
pd.pivot_table(data06, index = 'color', columns='clarity',values='price',
              aggfunc = 'size')

分组与聚合

import numpy as np
# MySQL  group by  abs按照指定的条件将单个单个的数据分门别类
# 聚合函数   max min avg sum count     分组之后才可以使用聚合函数
df1.groupby(by='color').size()
# 通过groupby方法,指定分组分量
grouped = df1.groupby(by = ['color','cut'])
# 对分组变量进行统计汇总
res = df1.groupby(by='color').aggregate({
    'color':np.size, 
    'carat':np.min, 
    'price':np.mean, 
    'table':np.max
})

# 调整变量名的顺序
result = pd.DataFrame(result, columns=['color','carat','price','table'])

# 数据集重命名
result.rename(columns={'color':'count',
                      'carat':'min_weight',
                      'price':'avg_price',
                      'table':'max_table'},
             inplace=True)

练习题

# 分析NBA各球队冠军次数及球员FMVP次数


# 爬虫相关知识 后续会讲  目前你仅仅理解为执行该方法就可以拿到一个表格数据

1.去除第一行的行标签
# 方式1
res = pd.read_html('https://baike.baidu.com/item/NBA%E6%80%BB%E5%86%A0%E5%86%9B/2173192?fr=aladdin',
                  header=0
                  )
res = res[0] # 获取有效数据
### 返回的是一个列表  列表中是当前页面的所有表格数据 
# 方式2
# 1.先修改列字段名称
res1.columns = res1.loc[0]
# 2.把数据项列字段数据移除
res1 = res1[1:]
# 或者
res1.drop(index=2)

2.分析NBA各球队冠军次数及球员FMVP次数
# 1.每个球队夺冠次数
res.groupby(by='冠军').size()
res.groupby(by='冠军').aggregate({'冠军':np.size})
# 2.夺冠及球员FMVP次数
res.groupby(by=['冠军','FMVP']).size()
res.groupby(by=['冠军','FMVP']).aggregate({'冠军':np.size,'FMVP':np.size})

数据的合并

# 数据的合并
# 数据的纵向合并
    # 相当于excel里面的添加数据
    
pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, keys=None)

objs:指定需要合并的对象,可以是序列、数据框或面板数据构成的列表 
axis:指定数据合并的轴,默认为0,表示合并多个数据的行,如果为1,就表示合并多个数据的列
join:指定合并的方式,默认为outer,表示合并所有数据,如果改为inner,表示合并公共部分的数据 
join_axes:合并数据后,指定保留的数据轴 
ignore_index:bool类型的参数,表示是否忽略原数据集的索引,默认为False,如果设为True,就表示忽略原索引并生成新索引
keys:为合并后的数据添加新索引,用于区分各个数据部分
    
# 构造数据集df1和df2
df1 = pd.DataFrame({
  'name':['张三','李四','王二'], 
  'age':[21,25,22], 
  'gender':['男','女','男']
})
df2 = pd.DataFrame({
  'name':['丁一','赵五'], 
  'age':[23,22], 
  'gender':['女','女']
})

# 数据集的纵向合并
pd.concat([df1,df2])
# 数据集的纵向合并
pd.concat([df1,df2] , keys = ['df1','df2']) # 加keys参数可以在合并之后看到数据来源

pd.concat([df1,df2] , keys = ['df1','df2']).reset_index() # 重置索引

pd.concat([df1,df2] , keys = ['df1','df2']).reset_index().drop(labels ='level_1',
axis = 1).rename(columns = {'level_0':'Class'}) # 删除不需要的列字段

# 如果df2数据集中的“姓名变量为Name”
df2 = pd.DataFrame({
    'Name':['丁一''赵五'],
    'age':[23,22],
    'gender':['女','女']
})

# concat行合并,数据源的变量名称完全相同(变量名顺序没有要求)

数据的连接

# 数据的横向合并
    # 相当于MySQL里面的连表操作
# MySQL        inner join     left join      right join      union
# select * from dep inner join emp on dep.id = emp.dep_id;

pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,
        left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'))

left:指定需要连接的主 
right:指定需要连接的辅表
how:指定连接方式,默认为inner内连,还有其他选项,如左连left、右连right和外连outer 
on:指定连接两张表的共同字段
left_on:指定主表中需要连接的共同字段
right_on:指定辅表中需要连接的共同字段 
left_index:bool类型参数,是否将主表中的行索引用作表连接的共同字段,默认为False right_index:bool类型参数,是否将辅表中的行索引用作表连接的共同字段,默认为False sort:bool类型参数,是否对连接后的数据按照共同字段排序,默认为False 
suffixes:如果数据连接的结果中存在重叠的变量名,则使用各自的前缀进行区分
    
# 构造数据集
df3 = pd.DataFrame({
    'id':[1,2,3,4,5],
    'name':['张三','李四','王二','丁一','赵五'],
    'age':[27,24,25,23,25],
    'gender':['男','男','男','女','女']
})
df4 = pd.DataFrame({
  'Id':[1,2,2,4,4,4,5], 
  'score':[83,81,87,75,86,74,88], 
  'kemu':['科目1','科目1','科目2','科目1','科目2','科目3','科目1']
})
df5 = pd.DataFrame({
  'id':[1,3,5],
  'name':['张三','王二','赵五'],
  'income':[13500,18000,15000]
})

# 首先df3和df4连接,同时将列字段删除
res=pd.merge(df3,df4,
             how='inner',
             left_on=df3['id'],
             right_on=df4['Id']).drop(columns=['key_0'])
# 将res和表df5进行合并
pd.merge(res,df5,left_on=res['id'],right_on=df5['id'])

# 将合并的数据导出
res.to_excel(r'aaa.xlsx')

今日作业

1.整理今日笔记
2.自动动手独立完成今日作业讲解
3.独立完成NBA球员数据筛选
4.研究处理excel表格时如何移除行索引
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值