侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

详解Python数据分析--Pandas知识点

Python  /  管理员 发布于 7年前   179

本文主要是总结学习pandas过程中用到的函数和方法, 在此记录, 防止遗忘

1. 重复值的处理

利用drop_duplicates()函数删除数据表中重复多余的记录, 比如删除重复多余的ID.

 import pandas as pd df = pd.DataFrame({"ID": ["A1000","A1001","A1002", "A1002"],         "departmentId": [60001,60001, 60001, 60001]}) df.drop_duplicates()

2. 缺失值的处理

缺失值是数据中因缺少信息而造成的数据聚类, 分组, 截断等

2.1 缺失值产生的原因

主要原因可以分为两种: 人为原因和机械原因.

1) 人为原因: 由于人的主观失误造成数据的缺失, 比如数据录入人员的疏漏;

2) 机械原因: 由于机械故障导致的数据收集或者数据保存失败从而造成数据的缺失.

2.2 缺失值的处理方式

缺失值的处理方式通常有三种: 补齐缺失值, 删除缺失值, 删除缺失值, 保留缺失值.

1) 补齐缺失值: 使用计算出来的值去填充缺失值, 例如样本平均值.

使用fillna()函数对缺失值进行填充, 使用mean()函数计算样本平均值.

import pandas as pdimport numpy as npdf = pd.DataFrame({'ID':['A10001', 'A10002', 'A10003', 'A10004'],           "Salary":[11560, np.NaN, 12988,12080]})#用Salary字段的样本均值填充缺失值df["Salary"] = df["Salary"].fillna(df["Salary"].mean())df

2) 删除缺失值: 当数据量大时且缺失值占比较小可选用删除缺失值的记录.

示例: 删除entrytime中缺失的值,采用dropna函数对缺失值进行删除:

 import pandas as pddf = pd.DataFrame({"ID": ["A1000","A1001","A1002"],         "entrytime": ["2015-05-06",pd.NaT,"2016-07-01" ]})df.dropna()

3) 保留缺失值.

3. 删除前后空格

使用strip()函数删除前后空格.

 import pandas as pd df = pd.DataFrame({"ID": ["A1000","A1001","A1002"],         "Surname": [" Zhao ","Qian"," Sun " ]}) df["Surname"] = df["Surname"].str.strip() df

4. 查看数据类型

查看所有列的数据类型使用dtypes, 查看单列使用dtype, 具体用法如下:

import pandas as pddf = pd.DataFrame({"ID": [100000,100101,100201],"Surname": [" Zhao ","Qian"," Sun " ]})#查看所有列的数据类型df.dtypes#查看单列的数据类型df["ID"].dtype

5. 修改数据类型

使用astype()函数对数据类型进行修改, 用法如下

import pandas as pddf = pd.DataFrame({"ID": [100000,100101,100201],"Surname": [" Zhao ","Qian"," Sun " ]})#将ID列的类型转化为字符串的格式df["ID"].astype(str)

6. 字段的抽取

使用slice(start, end)函数可完成字段的抽取, 注意start是从0开始且不包含end. 比如抽取前两位slice(0, 2).

import pandas as pddf = pd.DataFrame({"ID": [100000,100101,100201],"Surname": [" Zhao ","Qian"," Sun " ]})#需要将ID列的类型转换为字符串, 否则无法使用slice()函数 df["ID"]= df["ID"].astype(str)#抽取ID前两位df["ID"].str.slice(0,2)

7. 字段的拆分

使用split()函数进行字段的拆分, split(pat=None, n = -1, expand=True)函数包含三个参数:

第一个参数则是分隔的字符串, 默认是以空格分隔

第二个参数则是分隔符使用的次数, 默认分隔所有

第三个参数若是True, 则在不同的列展开, 否则以序列的形式显示.

import pandas as pddf = pd.DataFrame({"ID": [100000,100101,100201],"Surname_Age": ["Zhao_23","Qian_33","Sun_28" ]})#对Surname_Age字段进行拆分df_new = df["Surname_Age"].str.split("_", expand =True)df_new

8. 字段的命名

有两种方式一种是使用rename()函数, 另一种是直接设置columns参数

import pandas as pddf = pd.DataFrame({"ID": [100000,100101,100201],"Surname_Age": ["Zhao_23","Qian_33","Sun_28" ]})#第一种方法使用rename()函数# df_new = df["Surname_Age"].str.split("_", expand =True).rename(columns={0: "Surname", 1: "Age"})# df_new#第二种方法直接设置columns参数df_new = df["Surname_Age"].str.split("_", expand =True)df_new.columns = ["Surname","Age"]df_new

两种方式同样的结果:

9. 字段的合并

使用merge()函数对字段进行合并操作.

 import pandas as pd df = pd.DataFrame({"ID": [100000,100101,100201],"Surname_Age": ["Zhao_23","Qian_33","Sun_28" ]}) df_new = df["Surname_Age"].str.split("_", expand =True) df_new.columns = ["Surname","Age"] #使用merge函数对两表的字段进行合并操作.pd.merge(df, df_new, left_index =True, right_index=True)

10. 字段的删除

利用drop()函数对字段进行删除.

import pandas as pddf = pd.DataFrame({"ID": [100000,100101,100201],"Surname_Age": ["Zhao_23","Qian_33","Sun_28" ]})df_new = df["Surname_Age"].str.split("_", expand =True)df_new.columns = ["Surname","Age"]df_mer= pd.merge(df, df_new, left_index =True, right_index=True)#drop()删除字段,第一个参数指要删除的字段,axis=1表示字段所在列,inplace为True表示在当前表执行删除.df_mer.drop("Surname_Age", axis = 1, inplace =True)df_mer

删除Surname_Age字段成功:

11. 记录的抽取

1) 关系运算: df[df.字段名 关系运算符 数值], 比如抽取年龄大于30岁的记录.

import pandas as pddf = pd.DataFrame({"ID": [100000,100101,100201],"Surname_Age": ["Zhao_23","Qian_33","Sun_28" ]})df_new = df["Surname_Age"].str.split("_", expand =True)df_new.columns = ["Surname","Age"]df_mer= pd.merge(df, df_new, left_index =True, right_index=True)df_mer.drop("Surname_Age", axis = 1, inplace =True)#将Age字段数据类型转化为整型df_mer["Age"] = df_mer["Age"].astype(int)#抽取Age中大于30的记录df_mer[df_mer.Age > 30]

2) 范围运算: df[df.字段名.between(s1, s2)], 注意既包含s1又包含s2, 比如抽取年龄大于等于23小于等于28的记录.

df_mer[df_mer.Age.between(23,28)]

3) 逻辑运算: 与(&) 或(|) 非(not)

比如上面的范围运算df_mer[df_mer.Age.between(23,28)]就等同于df_mer[(df_mer.Age >= 23) & (df_mer.Age <= 28)]

df_mer[(df_mer.Age >= 23 ) & (df_mer.Age <= 28)]

4) 字符匹配: df[df.字段名.str.contains("字符", case = True, na =False)] contains()函数中case=True表示区分大小写, 默认为True; na = False表示不匹配缺失值.

import pandas as pdimport numpy as npdf = pd.DataFrame({"ID": [100000,100101,100201],"Surname_Age": ["Zhao_23","Qian_33","Sun_28"],"SpouseAge":[np.NaN,"32",np.NaN]})#匹配SpouseAge中包含2的记录df[df.SpouseAge.str.contains("2",na = False)]

当na改为True时, 结果为:

5) 缺失值匹配:df[pd.isnull(df.字段名)]表示匹配该字段中有缺失值的记录.

import pandas as pdimport numpy as npdf = pd.DataFrame({"ID": [100000,100101,100201],"Surname_Age": ["Zhao_23","Qian_33","Sun_28"],"SpouseAge":[np.NaN,"32",np.NaN]}) #匹配SpouseAge中有缺失值的记录df[pd.isnull(df.SpouseAge)]

12.记录的合并

使用concat()函数可以将两个或者多个数据表的记录合并一起, 用法: pandas.concat([df1, df2, df3.....])

import pandas as pddf1 = pd.DataFrame({"ID": ["A10006","A10001"],"Salary": [12000, 20000]})df2 = pd.DataFrame({"ID": ["A10008"], "Salary": [10000]})#使用concat()函数将df1与df2的记录进行合并pd.concat([df1, df2])

以上是部分内容, 还会持续总结更新....

以上所述是小编给大家介绍的Python数据分析--Pandas知识点详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对站的支持!


  • 上一条:
    详解Python读取yaml文件多层菜单
    下一条:
    详解Python基础random模块随机数的生成
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客