XieJava's blog

记录最好的自己


  • 首页

  • 分类

  • 标签

  • 归档

  • 关于

网络安全之常用安全设备功能及作用

发表于 2022-03-07 | 更新于: 2025-04-08 | 分类于 技术 , 网络安全 | | 阅读次数:
字数统计: 5.7k | 阅读时长 ≈ 19

随着网络技术发展,网络威胁无孔不入,网络攻击手段呈现复杂性及多变性的趋势。要建立防御体系应从通信网络、网络边界、局域网络内部、各种业务应用平台等各个层次落实各种安全措施,形成纵深防御体系。单靠一种或几种安全设备就想保护整个网络是不可能的事情。因此,为了满足不同防护需求的安全设备应运而生。有的设备是为了严防非授权访问。有的设备是为了实时检测,拦截攻击行为。有的设备是为了自查自审,发现自身存在的问题。每一种安全设备分工都不同,设备缺失肯定会使防御体系失效造成安全隐患。

本文介绍常用的安全设备及其能力

网络安全审计

网络安全审计通过对网络数据的采集、分析、识别,实时动态监测通信内容、网络行为和网络流量,发现和捕获各种敏感信息、违规行为,实时报警响应,全面记录网络系统中的各种会话和事件,实现对网络信息的智能关联分析、评估及安全事件的准确定位,为整体网络安全策略的制定提供权威可靠的支持。

  • 内容审计
    可对网页内容、邮件、数据库操作、论坛、即时通讯等提供完整的文本、图片和音视频内容检测、信息还原功能;并可自定义关键字库,进行细粒度的审计追踪。
  • 行为审计
    根据设定的行为审计策略,对网站访问、邮件收发、数据库访问、远程终端访问、文件上传下载、即时通讯、论坛、移动应用、在线视频、P2P 下载、网络游戏等网络应用行为进行监测,对符合行为策略的事件实时告警并记录。
  • 流量审计
    支持基于智能协议识别的流量分析功能;实时统计出当前网络中的各种协议流量,进行综合流量分析,提供详细的流量报表;可以统计指定协议流量的IP TOP N,为流量管理策略的制定提供可靠支持。

漏洞扫描

通过漏洞扫描全面发现信息系统存在的安全漏洞、安全配置问题、应用系统安全漏洞,检查系统存在的弱口令,收集系统不必要开放的账号、服务、端口,形成整体安全风险报告。

  • 全面系统脆弱性发现
    能够全方位检测系统存在的脆弱性,发现信息系统存在的安全漏洞、安全配置问题、应用系统安全漏洞,检查系统存在的弱口令,收集系统不必要开放的账号、服务、端口,形成整体安全风险报告,帮助安全管理人员先于攻击者发现安全问题,及时进行修补。
  • 风险统一分析
    支持全方位的安全漏洞、安全配置、应用系统安全漏洞扫描,通过安全风险计算方法,对网络系统中多个方面的安全脆弱性统一进行分析和风险评估,给出总体安全状态评价,全面掌握信息系统安全风险。
  • 识别非标准端口
    应用先进的非标准端口识别技术、以及丰富的协议指纹库,能够快速准确的识别非标准端口上的应用服务类型,并进一步进行漏洞检测,避免扫描过程中的漏报和误报。
  • 漏洞、配置知识库
    依托安全知识库,涵盖所有主流基础系统、应用系统、网络设备等网元对象,提供系统
    的配置检查库,提供专业安全厂商的加固修补建议,以及多个行业的安全配置检查标准。

Web漏洞扫描

定位于Web 脆弱性评估,实现全面Web 应用安全检测。帮助用户全面发现Web 漏洞,准确掌控网站风险,深度跟踪漏洞态势,提升快速响应能力。

  • 漏洞扫描及验证
    支持系统漏洞扫描以及Web 漏洞扫描,支持Web 应用漏洞分类,全面覆盖OWASP TOP10 应用风险,高中危漏洞专家级验证。
  • 网站挂马及黑链检测
    依托沙箱检测技术,识别网站页面中的恶意代码,对潜藏在用户网页中的黄赌毒私服等广告黑链进行周期性检测,并将挂马及黑链情况及时邮件提醒。
  • 网站篡改检测
    依托相似度对比技术,识别网页变更状态,并通知用户。
  • 网页敏感内容检测
    依托于敏感内容词库,识别网页中的敏感内容,并邮件提醒。
  • 可用性检测及 DNS 解析检测
    依托多个检测节点,多条检测线路,识别网站运营是否稳定的问题,并邮件提醒。

堡垒机

针对云主机、云数据库、网络设备等的运维权限、运维行为进行管理和审计。主要解决云上IT运维过程中操作系统账号复用、数据泄露、运维权限混乱、运维过程不透明等难题。

  • 登录功能
    支持对X11、linux、unix、数据库、网络设备、安全设备等一系列授权账号进行密码的自动化周期更改,简化密码管理,让使用者无需记忆众多系统密码,即可实现自动登录目标设备,便捷安全。
  • 账号管理
    支持统一账户管理策略,能够实现对所有服务器、网络设备、安全设备等账号进行集中管理,完成对账号整个生命周期的监控,并且可以对设备进行特殊角色设置如:审计巡检员、运维操作员、设备管理员等自定义设置,以满足审计需求。
  • 身份认证
    提供统一的认证接口,对用户进行认证,支持身份认证模式包括动态口令、静态密码、硬件key、生物特征等多种认证方式,设备具有灵活的定制接口,可以与其他第三方认证服务器之间结合;安全的认证模式,有效提高认证的安全性和可靠性。
  • 资源授权
    提供基于用户、目标设备、时间、协议类型IP、行为等要素实现细粒度的操作授权,最大限度保护用户资源的安全。
  • 访问控制
    支持对不同用户进行不同策略的制定,细粒度的访问控制能够最大限度的保护用户资源的安全,严防非法、越权访问事件的发生。
  • 操作审计
    能够对字符串、图形、文件传输、数据库等全程操作行为审计;通过设备录像方式实时监控运维人员对操作系统、安全设备、网络设备、数据库等进行的各种操作,对违规行为进行事中控制。对终端指令信息能够进行精确搜索,进行录像精确定位。

日志审计

日志审计是针对大量分散设备的异构日志进行高效采集、统一管理、集中存储、统计分析,可协助企业满足等保合规要求、高效统一管理资产日志并为安全事件的事后取证据供依据。

  • 安全日志源管理
    按照需要接入的日志源数量进行服务,提供多种日志接入方式,支持主动、被动采集。
  • 日志采集
    提供全面的日志采集能力:支持第三方安全设备、网络设备、数据库、windows/linux主机日志、web 服务器日志、虚拟化平台日志以及自定义等日志;提供强大的数据源管理功能:支持数据源的信息展示与管理、采集器的信息展示与管理以及agent 的信息展示与管理;提供分布式外置采集器、Agent 等多种日志采集方式;支持IPv4、IPv6 日志采集、分析以及检索查询。
  • 日志存储
    提供原始日志、范式化日志的存储,可自定义存储周期。
  • 日志检索
    提供丰富灵活的日志查询方式,支持全文.key-value、多kv布尔组合、括弧、正则、模糊等检索;提供便捷的日志检索操作,支持保存检索、从已保存的检索导入见多条件等。
  • 报表管理
    支持丰富的内置报表以及灵活的自定义报表模式,支持编辑报表的目录接口、引用统计项、设置报表标题、展示页眉和页码、报表配置基本内容(名称、描述等);支持实时报表、定时报表、周期性任务报表等方式;支持html、pdf、word 格式的报表文件以及报表logo
    的灵活配置。
  • 日志分析
    支持对各类应用系统产生的各类日志的分析功能。

数据库审计

数据库审计能够实时记录网络上的数据库活动,对数据库操作进行细粒度审计的合规性管理,对数据库遭受到的风险行为进行告警,对攻击行为进行阻断。通过对用户访问数据库行为的记录、分析和汇报,用来帮助用户事后生成合规报告、事故追根溯源,同时加强内外
部数据库网络行为记录,提高数据资产安全。

  • 实时告警
    风险操作:支持通过操作类型、操作对象、风险等级等多种元素细粒度定义要求监控的风险操作行为。
    SQL 注入:数据库安全审计提供SQL 注入库,可以基于SQL 命令特征或风险等级,发现数据库异常行为立即告警。
    系统资源:当系统资源(CPU、内存和磁盘)占用率达到设置的告警阈值时立即告警。
  • 多维度线索分析
    行为线索:支持审计时长、语句总量、风险总量、风险分布、会话统计、SQL 分布等多维度的快速分析。
    会话线索:支持根据时间、数据库用户、客户端等多角度进行分析。
    语句线索:提供时间、风险等级、数据用户、客户端IP、数据库IP、操作类型、规则等多种语句搜索条件。
  • 用户行为发现审计
    关联应用层和数据库层的访问操作:提供内置或自定义隐私数据保护规则,防止审计日志中的隐私数据(例如,账号密码)在控制台上以明文显示。
  • 精细化报表
    会话行为:提供客户端和数据库用户会话分析报表。
    风险操作:提供风险分布情况分析报表。
    合规报表:提供满足数据安全标准(例如Sarbanes-Oxley)的合规报告。

网页防篡改

网页防篡改是针对网站篡改攻击的防护,通过文件底层驱动技术对Web站点目录提供全方位的保护,为防止黑客、病毒等对目录中的网页、电子文档、图片、数据库等任何类型的文件进行非法篡改和破坏提供解决方案。

  • 篡改防护
    同时对多台网站服务器文件,对同一台服务器内的多个web server,对同一web server内的多个virtual host进行防篡改;异地(非网站目录)保留篡改后页面快照,支持网站篡改检测;保护防篡改内嵌模块和守护进程。
  • 防篡改分析
    支持页面文件/结构/元素的哈希(MD5)值篡改检测、图片相似性比较。
  • 攻击防护
    能够防止SQL 数据库注入式攻击;能够防止跨站脚本漏洞;能够防止网站盗链。
  • 发布备份
    支持内容发布;支持实时同步;支持手动同步;可按照条件(按时间戳前,后,区间;按子文件夹;按WEB 服务器);支持双机热备功能;实体间通信采用SSL 加密。
  • 日志告警
    保存系统日志;文件传输日志;支持篡改告警、SQL 注入告警、盗链告警,告警通知
    支持手机短信通知、邮件通知、管理界面警示框;可通过图形报表综合统计和分析。

入侵检测系统

入侵检测系统是一种对网络传输进行即时监视,在发现可疑传输时发出警报或者采取主动反应措施的网络安全系统。根据预先设定的安全策略,它是一种积极主动的安全防护技术。

  • 敏感数据外发检测
    能够识别并检测特定格式文件的外发,同时能够检测出文件中包含的敏感数据,进行告
    警,保护企业敏感数据,防止敏感数据泄露造成的损失。
  • 客户端攻击检测
    增加针对主流客户端应用程序的攻击签名规则,如Word、Excel、PDF、Firefox 等,增强客户终端应用程序的安全检测能力。
  • 服务器非法外联检测
    通过服务器的自学习功能或手动设置服务器正常外联行为,建立合法连接,能够检测服务器异于该合法连接的非法外联行为,及时产生告警信息通知网络管理人员,从而检测是否存在跳转等攻击行为。
  • 僵尸网络检测
    基于实时的信誉机制,结合企业级和全球信誉库,可有效检测恶意URL、僵尸网络,保护用户在访问被植入木马等恶意代码的网站地址时不受侵害,有效检测Web 威胁,并能及时发现网络中可能出现的僵尸网络主机和C&C 连接。

Web应用防火墙

基于对Web 流量的解码和分析,可应对Web 应用中的各类攻击,如SQL 注入、XSS注入、跨站请求伪造攻击、Cookie 篡改以及应用层Web 攻击等,能有效解决网页挂马、敏感信息泄露等安全问题,充分保障Web应用安全。通过精细的配置将多种Web安全检测方法连结成一套完整的安全体系,能够在IPv4、IPv6 及二者混合环境中抵御OWASP Top 10等各类Web安全威胁,通过服务化方式快速交付,保卫Web 应用免遭当前和未来的安全威胁。

  • Web 应用攻击防护
    内置多种防护策略,可选择进行 SQL 注入、XSS 攻击、命令注入、非法HTTP 协议请求、常见Web 服务器漏洞攻击、扫描防护等。
  • Web 漏洞
    Web 服务器漏洞探测,Web 服务器漏洞扫描(模拟攻击,判断缺陷,自动配置对应规则),及时发现漏洞隐患。
  • 注入攻击防护
    SQL 注入防御、LDAP 注入防御、命令注入防护(OS 命令,webshell 等)、XPath 注入防御、Xml/Json 注入防御。
  • IP 访问控制
    支持对指定IP 的加白和恶意IP 的封禁。
  • URL 访问控制
    支持对URL 进行黑白名单控制。
  • 爬虫防护
    基于源IP 周期判断访问数,防护恶意访问。

下一代防火墙

下一代防火墙采用高度一体化的架构设计方案,将所有的安全特性纳入到一体化的安全引擎。将传统五元组访问控制与具有下一代防火墙特征能力有机地结合起来,提供一个全新的网络边界防护解决方案。

  • 应用、用户识别能力
    可识别大部分应用,并可辅助用户对这些应用进行高效管理和筛查,包括5 维度分类组织,基于特性查询应用、自定义特殊应用等。
  • 监控统计
    对设备数据进行统计,并以柱状图、折线图、表格、报表、日志等方式呈现出来,帮助用户通过统计数据掌握设备状况,排查问题。
  • 用户认证
    对用户进行识别,通过认证的用户可以访问对应的管理资源。
  • 访问控制
    划分安全区域和非安全区域,区域之间的访问基于安全策略进行控制。
  • 入侵防御
    实时监控多种网络攻击并根据配置对网络攻击进行阻断等操作。
  • 病毒过滤
    探测各种病毒威胁,例如恶意软件、恶意网站等,并且根据配置对发现的病毒进行处理。
  • DNS 重定向
    支持对某一域名重定向到另一域名的功能。
  • 页面访问控制
    针对不同用户的权限对页面的访问进行区别。
  • 带宽管理
    能够管理和优化网络带宽,提高用户的网络体验和带宽资源利用率。
  • 云沙箱
    基于云端架构的恶意软件虚拟运行环境,发现未知威胁,多重静态检测引擎快速过滤正常文件及已知威胁,提升沙箱检测效率。
  • 僵尸网络 C&C 防护
    监控 C&C 连接发现内网肉鸡,阻断僵尸网络/勒索软件等高级威胁进一步破坏。
  • IP 信誉库
    识别过滤各种已知风险 IP,根据配置对风险IP 进行记录或阻断处理。
  • 封账号
    支持对网络账户封停的功能。
  • 包过滤
    支持对网络中的数据包的区分和限制功能。
  • 授权管理
    集中管理功能授权并可进行不同种类授权的统一下发。
  • 传统防火墙功能特性
    兼容传统防火墙功能特性,包括访问控制、日志报表、会话管理等。

入侵防护系统

入侵防护系统是一个监视网络或网络设备的网络资料传输行为的系统,能够深入网络数据内部,即时中断、调整或隔离一些有害数据流。入侵防护系统可主动拦截黑客攻击、据虫、网络病毒、后门木马、DoS 等恶意流量,保护企业信息系统和网络架构免受侵害,防止操作
系统和应用程序损坏或宕机。

  • 敏感数据保护
    提供敏感数据识别、数据安全审计、数据脱敏、智能异常检测等数据安全能力,形成一体化的数据安全解决方案。
  • 高级威胁防御
    高级威胁防御能够基于敏感数的外泄、文件识别、服务器非法外联等异常行为检测,实现内网的高级威胁防御功能。
  • 恶意文件防御
    网络中存在大量恶意文件,通过网站文件服务器、邮件服务器实现传播,对企业网络安全构成潜在威胁。对网络中传送的文件,进行快速检测,比对文件信誉,对发现恶意的文件进行告警和阻断。
  • 网址/网站检测分析
    支持对网站的URL 进行检测,并分析其是否是恶意网能力。

防病毒

防病毒可以对计算机病毒、木马和恶意软件等一切已知的对计算机有危害的程序代码进行清除,提供终端查杀病毒、软件管理、漏洞补丁、统一升级管理等功能。

  • 安全防御
    能够精准识别、分析及响应病毒传播、0day 攻击及APT 攻击等异常行为。

  • 主机防火墙
    支持对IP、端口协议及访问方向等维度过滤,能智能识别网络协议,同时可通过IP 黑
    白名单,控制终端只能访问指定目标地址,或指定来源IP 地址访问。

  • 漏洞加固
    实时扫描记录终端的操作系统及常用应用软件漏洞,掌握全网终端漏洞情况及补丁修复。

  • 勒索病毒防御
    基于HIPS 的勒索者主动防御机制,蠕虫病毒、勒索病毒、宏病毒等已知未知威胁防范无忧。

  • 安全审计
    对攻击、病毒及漏洞等终端运行信息,以及上网行为、U 盘使用及文件操作等终端行为信息进行统一收集。

  • 软件管理
    记录全网安装软件清单以及每种软件安装的终端明细,以及软件使用时长。

  • 流量管控
    对终端流量管理包括总流量、上行及下行等管理,同时支持升级下载及日志上传等细粒度的流量管理。

终端检测与响应

利用终端检测响应,对终端的运行状态进行检测和监控,对进程、文件和配置等进行分析,对异常行为进行处理,确保主机安全,从而实现东西向防护。

  • 病毒及恶意程序防护
    基于文件动作行为特征模型分析查杀,主动防御型查杀,文件黑白名单管理,文件多算法(MD5、SHA1、SHA256)校验。
  • 攻击与威胁防护
    检测模式,拦截模式,支持端口扫描、泛洪攻击、TCP 洪水攻击、漏洞攻击、注册表安全检测等。
  • 主机网络访问隔离
    基于主机维度,定义出入站网络访问,能自定义网络访问对象和端口对象,并记录违规访问日志,可追溯网络访问发起的进程及进程详细路径和进程文件安全性。
  • 终端环境强控
    通过设定终端运行的白环境,达到除白名单外的文件无法运行。
  • 安全基线检查
    同时含盖 Windows 和Linux 平台,支持帐号与口令检查、密码生存周期检查、远程登录检查、网络与服务检查、日志审计检查、防火墙检查、系统安全配置检查等内容,核查项完全满足工信部等单位要求。
  • 沙箱防护
    云端沙箱检查结果查询,用户本地上传文件至沙箱。

作者博客:http://xiejava.ishareread.com/


“fullbug”微信公众号

关注微信公众号,一起学习、成长!

pandas快速入门指南

发表于 2022-02-23 | 更新于: 2025-04-08 | 分类于 技术 , 开发 | | 阅读次数:
字数统计: 742 | 阅读时长 ≈ 2

pandas

Pandas 是一个开源的第三方 Python 库,从 Numpy 和 Matplotlib 的基础上构建而来,享有数据分析“三剑客之一”的盛名(NumPy、Matplotlib、Pandas)。是学习数据分析、AI机器学习必学组件之一。
Pandas 这个名字来源于面板数据(Panel Data)与数据分析(data analysis)这两个名词的组合。在经济学中,Panel Data 是一个关于多维数据集的术语。Pandas 对数据的处理是为数据的分析服务的,它所提供的各种数据处理方法、工具是基于数理统计学出发,包含了日常应用中的众多数据分析方法。

Pandas 可以实现复杂的处理逻辑,这些往往是 Excel 等工具无法处理的,还可以自动化、批量化,对于相同的大量的数据处理我们不需要重复去工作。Pandas 的出现使得 Python 做数据分析的能力得到了大幅度提升,它主要实现了数据分析的五个重要环节:

  • 加载数据
  • 整理数据
  • 操作数据
  • 构建数据模型
  • 分析数据

主要特点

  • 它提供了一个简单、高效、带有默认标签(也可以自定义标签)的 DataFrame 对象。
  • 能够快速得从不同格式的文件中加载数据(比如
    Excel、CSV 、SQL文件),然后将其转换为可处理的对象;
  • 能够按数据的行、列标签进行分组,并对分组后的对象执行聚合和转换操作;
  • 能够很方便地实现数据归一化操作和缺失值处理;
  • 能够很方便地对 DataFrame 的数据列进行增加、修改或者删除的操作;
  • 能够处理不同格式的数据集,比如矩阵数据、异构数据表、时间序列等;
  • 提供了多种处理数据集的方式,比如构建子集、切片、过滤、分组以及重新排序等。

本教程梳理了快速入门pandas的一些知识点。

pandas快速入门

一、pandas数据结构(Series和DataFrame)

二、pandas数据加载(csv、excel、json、mysql、webAPI)

三、pandas基本操作之数据访问(查看与检索)

四、pandas数据分析之排序和排名(sort和rank)

五、pandas数据清洗之处理缺失、重复、异常数据

六、pandas数据处理之数据转换(映射map、替换replace、重命名rename)

七、pandas数据分析之数据运算(逻辑运算、算术运算、统计运算、自定义运算)

八、pandas数据处理之合并与拼接

九、pandas数据分析之分组聚合

十、pandas数据分析之数据重塑透视(stack、unstack、melt、pivot)

十一、pandas数据分析之数据绘图

学习pandas最好的资料肯定是pandas的官网 https://pandas.pydata.org/docs/user_guide/index.html

书籍推荐pandas的作者写的《利用python进行数据分析》


本教程作者博客:http://xiejava.ishareread.com/


“fullbug”微信公众号

关注:微信公众号,一起学习成长!

pandas数据分析之数据绘图

发表于 2022-02-16 | 更新于: 2025-04-08 | 分类于 技术 , 开发 | | 阅读次数:
字数统计: 2.4k | 阅读时长 ≈ 9

一图胜千言,将信息可视化(绘图)是数据分析中最重要的工作之一。它除了让人们对数据更加直观以外,还可以帮助我们找出异常值、必要的数据转换、得出有关模型的想法等等。pandas 在数据分析、数据可视化方面有着较为广泛的应用。本文将通过实例介绍pandas的数据绘图。
pandas数据绘图

pandas的数据可视化依赖于matplotlib模块的pyplot类,matplotlib在安装Pandas会自动安装。Matplotlib可以对图形做细节控制,绘制出出版质量级别的图形,通过Matplotlib,可以简单地绘制出常用的统计图形。pandas 对 Matplotlib 绘图软件包的基础上单独封装了一个plot()接口,通过调用该接口可以实现常用的绘图操作。
让我们先来认识mataplotlib图形的基本构成。

一、matplotlib图形基本构成

1
2
3
4
import matplotlib.pyplot as plt
import numpy as np
data=np.arange(10)
plt.plot(data)

matplotlib.plot()

通过引入matplotlib模块的pyplot类,将数据传入plot()的接口,就可以将数据以图形化的方式展示出来。Matplotlib 生成的图形主要由以下几个部分构成:
绘图基本结构

  • Figure:指整个图形,您可以把它理解成一张画布,它包括了所有的元素,比如标题、轴线等;
  • Axes:绘制 2D图像的实际区域,也称为轴域区,或者绘图区;
  • Axis:指坐标系中的垂直轴与水平轴,包含轴的长度大小(图中轴长为 7)、轴标签(指 x轴,y轴)和刻度标签;
  • Artist:在画布上看到的所有元素都属于 Artist对象,比如文本对象(title、xlabel、ylabel)、Line2D 对象(用于绘制2D图像)等。

了解matplotlib图形的基本构成非常重要,绘图就是通过matplotlib提供的方法来定义和设置这些基本图形的构成元素来将数据显示在这些元素中。

二、matplotlib显示中文

Matplotlib 默认不支持中文字体,这因为 Matplotlib 只支持 ASCII 字符,但中文标注更加符合中国人的阅读习惯。下面介绍如何在 Windows 环境下让 Matplotlib 显示中文。

1、方法一:临时重写配置文件(临时)

通过临时重写配置文件的方法,可以解决 Matplotlib 显示中文乱码的问题,代码如下所示:

1
2
3
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"]=["SimHei"] #设置字体
plt.rcParams["axes.unicode_minus"]=False #该语句解决图像中的“-”负号的乱码问题

2、方法二:修改配置文件 (永久)

通过直接修改配置文件的方法,可以一劳永逸的解决 Matplotlib 的中文乱码问题。注意此过程在 Windows 环境下进行。
Matplotlib 从配置文件 matplotlibrc 中读取相关配置信息,比如字体、样式等,因此我们需要对该配置文件进行更改。使用如下代码查看 matplotlibrc 所在的目录:

1
2
import matplotlib
matplotlib.matplotlib_fname()

matplotlib_fname

打开配置文件后,找到以下信息:
#font.family: sans-serif
#font.serif: DejaVu Serif, Bitstream Vera Serif, Computer Modern Roman, New Century Schoolbook, Century Schoolbook L, Utopia, ITC Bookman, Bookman, Nimbus Roman No9 L, Times New Roman, Times, Palatino, Charter, serif
修改配置将#注释去掉,并将微软雅黑Microsoft YaHei的字体给加上。
微软雅黑
最后,在windows的字体目录中复制中文字体微软雅黑:
C:\Windows\Fonts\Microsoft YaHei UI
将微软雅黑的字体复制粘贴到matplotlib的字体库中,字体库路径就在matplotlibrc 所在的目录下
D:\Anaconda3\Lib\site-packages\matplotlib\mpl-data\fonts\ttf
复制字体
如果是jupyter notbook重启启动jupyter notbook让它重新读取配置文件即可。

三、pandas绘图

数据分析将数据进行可视化绘图展示离不开数据,pandas的两大数据结构Series和DataFrame都提供了相应的方法很方便的进行数据的可视化绘图展示。

1、数据

pandas 提供了 plot() 方法可以快速方便地将 Series 和 DataFrame 中的数据进行可视化。

a) Series

Series 使用 plot 时 x 轴为索引,y 轴为索引对应的具体值:

1
2
3
4
5
import numpy as np
import pandas as pd
series_data=pd.Series(np.random.randn(10),index=range(10))
series_data
series_data.plot()

Series绘图

b) DataFrame

DataFrame 使用 plot 时 x 轴为索引,y 轴为索引对应的多个具体值:

1
2
3
df_staff = pd.read_excel('D:\\Python\\study\\pythontest\\pandastest\\数据集\\staff_sale_byQ.xlsx')
df_staff
df_staff.plot()

DataFrame绘图
plot()可以通过传入x和y指定显示具体的列数据

1
2
#指定X轴及y显示的列数据
df_staff.plot(x='季度',y=['张三','李四'])

dataframe指定x和y

2、图形

plot 默认为折线图,折线图也是最常用和最基础的可视化图形,足以满足我们日常 80% 的需求。
除了使用默认的线条绘图外,还可以使用其他绘图方式,如下所示:

  • 柱状图:bar() 或 barh()
  • 箱形图:box()
  • 区域图:area()
  • 饼状图:pie()
  • 散点图:scatter()
  • 直方图:hist()

a) 柱状图

柱状图(bar chart),使用与轴垂直的柱子,通过柱形的高低来表达数据的多少,适用于数据的对比,在整体中也能看到数据的发展变化趋势。
DataFrame 可以直接调用 plot.bar() 生成折线图,与折线图类似,x 轴为索引,其他数字类型的列为 y 轴上的条形,可以设置参数stacked=True生成柱状堆叠图
df.plot.bar()
df.plot.barh() # 横向
df[:5].plot.bar(x=’name’, y=’Q4’) # 指定xy轴
df[:5].plot.bar(‘name’, [‘Q1’, ‘Q2’]) # 指定xy轴

1
2
3
4
5
6
#柱状图
df_staff.plot.bar(x='季度',y=['张三','李四','王五'])
#柱状图可以设置参数stacked=True生成柱状堆叠图
df_staff.plot.bar(x='季度',y=['张三','李四','王五'],stacked=True)
#通过barh()方法可以绘制水平柱状图
df_staff.plot.barh(x='季度',y=['张三','李四','王五'],stacked=True)

柱状图

b) 箱形图

箱形图(Box Chart)又称盒须图、盒式图或箱线图,是一种用作显示一组数据分布情况的统计图。Series.plot.box() 、 DataFrame.plot.box(), 和 DataFrame.boxplot() 都可以绘制箱形图。
从箱形图中我们可以观察到:

  • 一组数据的关键值:中位数、最大值、最小值等。
  • 数据集中是否存在异常值,以及异常值的具体数值。
  • 数据是否是对称的。
  • 这组数据的分布是否密集、集中。
  • 数据是否扭曲,即是否有偏向性。
1
df_staff.plot.box(x='季度',y=['张三','李四','王五'])

箱形图

c) 区域图

区域图(Area Chart),又叫面积图。 将折线图中折线与自变量坐标轴之间的区域使用颜色或者纹理填充,这样一个填充区域叫做面积,颜色的填充可以更好的突出趋势信息,需要注意的是颜色要带有一定的透明度,透明度可以很好的帮助使用者观察不同序列之间的重叠关系,没有透明度的面积会导致不同序列之间相互遮盖减少可以被观察到的信息。
面积图默认情况下是堆叠的。 要生成堆积面积图,每列必须全部为正值或全部为负值。

1
df_staff.plot.area(x='季度',y=['张三','李四','王五'])

区域图

d) 饼状图

饼图(Pie Chart)广泛得应用在各个领域,用于表示不同分类的占比情况,通过弧度大小来对比各种分类。饼图通过将一个圆饼按照分类的占比划分成多个区块,整个圆饼代表数据的总量,每个区块(圆弧)表示该分类占总体的比例大小,所有区块(圆弧)的加和等于 100%。
可以使用 DataFrame.plot.pie() 或 Series.plot.pie() 创建饼图

1
2
3
4
5
6
7
df_staff
#看张三每个季度的业绩分布
df_staff.plot.pie(y='张三',subplots=True)
#看第一个季度,每个人的绩效分布
df_staff1=df_staff.loc[0:0,'张三':'孙八'].T
df_staff1.columns=['Q']
df_staff1.plot.pie(y='Q',subplots=True)

饼图

e) 散点图

散点图(Scatter graph)也叫 X-Y 图,它将所有的数据以点的形式展现在直角坐标系上,以显示变量之间的相互影响程度,点的位置由变量的数值决定。
通过观察散点图上数据点的分布情况,我们可以推断出变量间的相关性。如果变量之间不存在相互关系,那么在散点图上就会表现为随机分布的离散的点,如果存在某种相关性,那么大部分的数据点就会相对密集并以某种趋势呈现。

1
2
df1 = pd.DataFrame(np.random.rand(50, 4), columns=["a", "b", "c", "d"])
df1.plot.scatter(x="a", y="b");

散点图

f) 直方图

直方图(Histogram),又称质量分布图,是一种统计报告图,它是根据具体数据的分布情况,画成以组距为底边、以频数为高度的一系列连接起来的直方型矩形图。
直方图说明

1
2
3
4
5
6
7
8
9
10
11
#构建数据集
df4=pd.DataFrame({
"a": np.random.randn(1000) + 1,
"b": np.random.randn(1000),
"c": np.random.randn(1000) - 1,
"d": np.random.randn(1000) - 2,
},columns=['a','b','c','d'])
df4
df4.plot.hist(alpha=0.5) #指定图形透明度
df4.plot.hist(stacked=True,bins=20) #堆叠并指定箱数为20
df4.diff().hist() #通过diff给每一列数据都绘制一个直方图

直方图

至此,本文介绍了pandas常用的绘图组件matplotlib,包括mataplotlib绘图的基本构成,如何在windows下解决中文问题,并通过实例介绍了如何通过pandas的数据集绘制折线图、箱线图、柱状图、饼图、面积图、散点图、直方图等。

参考资料:《利用python进行数据分析》、pandas官网 user guide

数据集及源代码见:https://github.com/xiejava1018/pandastest.git


作者博客:http://xiejava.ishareread.com/


“fullbug”微信公众号

关注:微信公众号,一起学习成长!

pandas数据分析之数据重塑透视(stack、unstack、melt、pivot)

发表于 2022-02-14 | 更新于: 2025-04-08 | 分类于 技术 , 开发 | | 阅读次数:
字数统计: 2k | 阅读时长 ≈ 7

在数据分析的过程中,分析师常常希望通过多个维度多种方式来观察分析数据,重塑和透视是常用的手段。
数据的重塑简单说就是对原数据进行变形,为什么需要变形,因为当前数据的展示形式不是我们期望的维度,也可以说索引不符合我们的需求。对数据的重塑不是仅改变形状那么简单,在变形过程中,数据的内在数据意义不能变化,但数据的提示逻辑则发生了重大的改变。
数据透视是最常用的数据汇总工具,Excel 中经常会做数据透视,它可以根据一个或者多个指定的维度来聚合数据。pandas 也提供了数据透视函数来实现这些功能。
如果能熟练区分和使用各种重塑和透视分析方法,那用pandas处理分析日常的数据基本上就没有什么难度了。

重塑和透视

在介绍数据重塑透视之前,先来介绍一下pandas中DataFrame的层次化索引,它广泛应用于重塑透视操作。

一、层次化索引

层次化索引是pandas的一项重要功能,它使你能在一个轴上拥有多个(两个以上)索引层数,分层索引的目的是用低维度的结构(Series 或者 DataFrame)更好地处理高维数据。通过分层索引,我们可以像处理二维数据一样,处理三维及以上的数据。分层索引的存在使得分析高维数据变得简单。
我们来看一下student数据集,并根据该数据集分别构建列和行的层次索引。然后再介绍数据的重塑和透视。
引入student数据集:

1
2
3
4
import numpy as np
import pandas as pd
df = pd.read_excel('D:\\Python\\study\\pythontest\\pandastest\\数据集\\student.xlsx')
df

student数据集

该student数据集包含学生学号、姓名、语文、数据、英语的成绩等。

1、列索引分层

我们选取一些关键的数据构建列标签的层次化索引。这里我们选取’班级’,’姓名’,’语文’,’数学’,’英语’的列,并且将‘班级’、‘姓名’标记为‘标识’,’语文’,’数学’,’英语’标记为‘成绩’

1
2
3
df_student=df[['班级','2-姓名','4-语文','5-数学','6-英语']]
df_student.columns=[['标识','标识','成绩','成绩','成绩'],['班级','姓名','语文','数学','英语']]
df_student

列索引分层
通过指定DataFrame的columns的层级将’班级’,’姓名’,’语文’,’数学’,’英语’,上多抽出了一个层级,这个层有两个索引一个是‘标识’,一个是成绩,其中‘班级’和‘名称’是属于标识,’语文’,’数学’,’英语’都是’成绩’。

2、行索引分层

接下来看行索引的分层。我们将属于一班的和属于二班的同学进行分层,再分成两个索引。

1
2
3
4
#根据行索引分层,设置行索引将其分成班级和姓名两个层次索引
df_student=df_student.set_index([('标识','班级'),('标识','姓名')])
df_student.index.names=['班级','姓名']
df_student

行索引的分层

可以看到将数据集的班级和姓名列分成了两个行的层级索引。没有用默认的0-9的行索引

二、数据堆叠与拆堆

层次化索引为DataFrame数据的重排任务提供了一种具有良好一致性的方式,有许多用于重新排列表格数据的基础运算。这些函数也称作重塑(reshape)或轴向旋转(pivot)运算。
常见的数据重塑包括数据的堆叠 stack 和 取消堆叠 unstck

1、数据堆叠 stack

堆叠 stack ,顾名思义,就是将列的数据堆叠形成行。
借用pandas官网的示意图:
堆叠 stack

看实际数据数据会更容易理解,为了方便我们取student数据集的前5行记录来进行数据堆叠stack()

1
2
3
4
5
df_student[:5]
#将数据进行堆叠
#将数据进行堆叠
df_student5=df_student[:5].stack()
df_student5

堆叠 stack()

在这里可以看到通过stack()将“语文”、“数学”、”英语”,三列,一个个堆叠形成一条记录的三行。这样列数减少了,行数增多了。

stack()

对于多层索引,可以根据指定堆叠层次,默认是最高层次的堆叠。
我们来看指定堆叠层次,如果stack(0),表示堆叠level0层的。

分层堆叠

2、取消堆叠 unstack

取消堆叠 unstack是堆叠的反操作。
Unstack

也就是将堆叠好了的行数据,一个个卸下来形成列。这样一来行数减少了,但是列数增多了。

1
2
# 取消堆叠 unstack()
df_student5.unstack()

unstack

可以看到原来的“语文”、“数学”、”英语”三行,通过unstack()进行拆堆,拆成了三列,明显数据没有那么高了,行数少了,列数多了。
unstack

同样对于多层索引可以逐层拆堆
逐层拆堆

三、数据融合与透视

数据透视是最常用的数据汇总工具,它可以根据一个或者多个指定的维度来聚合数据。实际上搞懂了stack和unstack就很容易搞懂pivot和melt了,stack和unstack根据索引来进行堆叠和拆堆,pivot和melt可以根据指定的数据来进行变换操作灵活性更高。

1、数据融合 melt

来看pandas官网的示意图,是不是和stack的图有点类似,都是将列转换成行,不同的是melt可以指定哪些列固定,哪些列转换成行等灵活性更高。简单说就是将指定的列放到铺开放到行上名为variable(可指定)列,值在value(可指定)列
melt
melt语法:

1
2
3
4
pd.melt(frame: pandas.core.frame.DataFrame,
id_vars=None, value_vars=None,
var_name='variable', value_name='value',
col_level=None)

其中:

  • id_varstuple,list或ndarray(可选),用作标识变量的列。
  • value_varstuple,列表或ndarray,可选,要取消透视的列。 如果未指定,则使用未设置为id_vars的所有列。
  • var_namescalar,用于“变量”列的名称。 如果为None,则使用frame.columns.name或“variable”。
  • value_namescalar,默认为“ value”,用于“ value”列的名称。
    • col_levelint或str,可选,如果列是MultiIndex,则使用此级别来融化。

我们还是来看示例:
数据集还是student数据集,为了演示方便取前5条记录

1
2
3
df_student=df[['班级','2-姓名','4-语文','5-数学','6-英语']]
df_student.columns=[['标识','标识','成绩','成绩','成绩'],['班级','姓名','语文','数学','英语']]
df_student[0:5]

melt

现在将“班级”和“姓名”固定,’语文’,’数学’,’英语’三列转换成行融合为“学科”字段,这三个列的值定义为“分数”列。

1
2
3
4
5
# 将“班级”和“姓名”固定,'语文','数学','英语'三列转换成行融合为“学科”字段,这三个列的值定义为“分数”列
df_student[0:5].melt(id_vars=['班级','姓名'],
value_vars=['语文','数学','英语'],
var_name='学科',
value_name='分数',col_level=1)

melt
具体实现如下图所示:
melt

2、数据透视 pivot

来看pandas官网的示意图,是不是和unstack的图有点类似,将行数据转换成列。同样pivot提供了更多的参数可以指定相应的数据进行转换,比unstack更加灵活。
pivot

这里有三个参数,作用分别是:

  • index:新 df 的索引列,用于分组,如果为None,则使用现有索引
  • columns:新 df 的列,如果透视后有重复值会报错
  • values:用于填充 df 的列。 如果未指定,将使用所有剩余的列,并且结果将具有按层次结构索引的列
1
2
3
4
5
6
df_student5=df_student[0:5].melt(id_vars=['班级','姓名'],
value_vars=['语文','数学','英语'],
var_name='学科',
value_name='分数',col_level=1)
df_student5
df_student5.pivot(index=['班级','姓名'],columns='学科',values='分数')

pivot

这里通过pivot将“学科”的行数据透视转换成“数学”、“英语”、“语文”三列,具体实现如下图所示:
privot
可以看出privot实际和unstack类似是由行转换成列的视图,但比起unstack更加灵活。

至此,介绍了pandas的多层索引及pandas的4种重塑操作:stack、unstack、pivot、melt:
stack、unstack是基础:stack实现列转行,unstack实现行转列。
melt与stack类似,比stack更加灵活。
pivot与unstack类似,比unstack更加灵活。

数据集及源代码见:https://github.com/xiejava1018/pandastest.git


作者博客:http://xiejava.ishareread.com/


“fullbug”微信公众号

关注:微信公众号,一起学习成长!

pandas数据分析之分组聚合

发表于 2022-02-12 | 更新于: 2025-04-08 | 分类于 技术 , 开发 | | 阅读次数:
字数统计: 1.8k | 阅读时长 ≈ 7

在数据分析过程中,经常会需要根据某一列或多列把数据划分为不同的组别,然后再对其进行数据分析。本文将介绍pandas的数据分组及分组后的应用如对数据进行聚合、转换和过滤。

分组聚合

在关系型数据库中我们常用SQL的GROUP BY操作进行分组分析计算。在pandas中要完成数据的分组操作同样可用groupby()函数,然后再在划分出来的组(group)上应用一些统计函数,从而达到数据分析的目的,比如对分组数据进行聚合、转换或者过滤。这个过程主要包含以下三步:拆分(split)-应用(apply)-合并(combine)
例如,DataFrame可以在列(axis=1)或行(axis=0)上进行分组(split),然后将一个函数应用(apply)到各个分组并产生一个新值,最后所有这些函数的执行结果会被合并(combine)到最终的结果对象中。
一个简单的分组聚合的过程如下图所示:
拆分(split)-应用(apply)-合并(combine)

我们来构造图中所示的DataFrame数据集,看看pandas的分组聚合是怎么做的。

1
2
3
4
import pandas as pd
import numpy as np
df=pd.DataFrame({'key':['A','B','C','A','B','C','A','B','C'],'data':[0,5,10,5,10,15,10,15,20]})
df

数据集

1
2
3
4
5
grouped=df.groupby(['key']) #通过key分组
#查看分组情况
for dtype,group in grouped:
print(dtype)
grouped.sum() #对每个分组应用sum函数,并最后组合成结果

对df的key进行用groupby()进行分组
通过对df的key进行用groupby()进行分组,这里可看到,将数据分成了A、B、C三组,然后对这三组分别应用sum()函数求和,再组合成最终的结果。
对于分组聚合一般来说实际上是分两步:一是创建分组对象进行分组,二是对分组进行相应处理如(对组应用聚合函数、对组进行转换、对组的数据进行过滤)。不过实际在具体写的时候可以通过链式调用一个语句就可以实现如:

1
df.groupby(['key']).sum() #链式调用先分组再用聚合函数聚合

链式调用先分组再用聚合函数聚合

一、创建分组对象进行分组

groupby可以把分组时指定的键(key)作为每组的组名。groupby对象支持迭代,可以遍历每个分组的具体数据。
如:

1
2
3
4
#查看分组情况
for name,group in grouped:
print(name)
print(group)

查看分组情况

1、根据多列进行分组

groupby可以通过传入需要分组的参数实现对数据的分组,参数可以是单列,也可以是多列,多列以列表的方式传入。

1
grouped=df.groupby(['key1','key2'])

多列进行分组

2、通过字典或Series进行分组

除数组以外,分组信息还可以其他形式存在。如可以定义字典或Series进行分组。

1
2
3
4
5
6
7
8
9
10
people=pd.DataFrame(np.random.randn(5,5),
columns=['a','b','c','d','e'],
index=['Joe','Steve','Wes','Jim','Bob'])
people
mapping={'a':'red','b':'red','c':'blue','d':'blue','e':'red'}#定义分组字典
by_column=people.groupby(mapping,axis=1)
#查看分组情况
for group_name,group_data in by_column:
print(group_name)
print(group_data)

字典分组

在字典中我们定义了mapping={'a':'red','b':'red','c':'blue','d':'blue','e':'red'}#定义分组字典
a、b、e对应“red”,c、d对应“blue”所以将blue和red分成了两组。
sum聚合

应用sum()求和函数,可以看到分别对blue和red的分组进行了求和。
类似的,Series也是一样的,我们将map转换成Series,可以看到分组结果和map分组一样的。
Series分组

3、通过函数进行分组

比起使用字典或Series,使用Python函数是一种更原生的方法定义分组映射,。任何被当做分组键的函数都会在各个索引值上被调用一次,其返回值就会被用作分组名称。
如上面的people数据集,将姓名索引的长度进行分组。

1
by_len=people.groupby(len)

by_len

可以看到将姓名长度相同的3分成一组,长度为5的数据分成了一组
更加通用的是可以自定义函数进行分组,如要将索引>5的和小于5的分别分组,可以自定义函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#数据集
df=pd.DataFrame({'key':['A','B','C','A','B','C','A','B','C'],
'data':[0,5,10,5,10,15,10,15,20]},
index=[1,2,3,4,5,6,7,8,9])
df
#自定义函数区分大于5和小于5的数据
def big5(x):
result=0
if x>5:
result=1
return result

by_big5=df.groupby(big5) #根据索引是否大于5进行分组
#查看分组情况
for group_name,group_data in by_big5:
print(group_name)
print(group_data)

自定义函数分组

二、对分组后的数据进行应用

前面通过分组将数据集根据条件分组后,可以对分组后的数据进行各种处理包括聚合、转换、过滤等操作。

1、对分组数据用聚合函数进行聚合

a) 使用pandas聚合函数

前面第一部分的例子中对数据分组后进行了sum()求和聚合操作,类似的聚合函数还有很多如:

函数名 描述
count 分组中非NA值的数量
sum 非NA值的和
mean 非NA值的平均值
median 非NA值的中位数
std, var 标准差和方差
min, max 非NA的最小值,最大值
prod 非NA值的乘积
first, last 非NA值的第一个,最后一个

聚合函数

b) 使用自定义聚合函数

pandas的groupby分组对象还可以用自定义的聚合函数可以通过groupby分组对象,将你自己的聚合函数,传入aggregate或agg方法即可

1
2
df=pd.DataFrame({'key':['A','B','C','A','B','C','A','B','C'],'data':[0,5,10,5,10,15,10,15,20]})
df

数据集

1
2
3
4
5
grouped=df.groupby(['key'])
#查看分组情况
for group_name,group_data in grouped:
print(group_name)
print(group_data)

分组情况

1
2
3
4
def peak_to_peak(arr):
return arr.max() - arr.min()

grouped.agg(peak_to_peak)

自定义函数分组

2、根据分组数据进行转换

根据分组数据进行数据转换或其他操作,可以在分组的基础上用apply函数进行数据的转换。
如数据集

1
2
3
4
5
6
7
8
9
df=pd.DataFrame({'key':['A','B','C','A','B','C','A','B','C'],
'data':[0,5,10,5,10,15,10,15,20]})
df
根据key分组
grouped=df.groupby(['key'])
#查看分组情况
for group_name,group_data in grouped:
print(group_name)
print(group_data)

数据集

现在我们要对data求和后小于25的分组数据都加1
那么我们可以定义函数,然后再对分数数据进行应用

1
2
3
4
5
6
def add1(df):
if df[:]['data'].sum()<25:
return df[:][['data']]+1
else:
return df[:][['data']]
grouped.apply(add1)

数据转换

3、根据分组数据进行过滤

通过 filter() 函数可以实现数据的筛选,该函数根据定义的条件过滤数据并返回一个新的数据集。
如当我们要过滤掉分组后data求和小于25的数据

1
2
3
4
5
6
7
#过滤掉sum()求和小于25的数据
def filtersum25(x):
if x['data'].sum()>25:
return True
else:
return False
grouped.filter(filtersum25)

数据过滤

至此,本文通过实例介绍了pandas的数据分组及分组后的应用如对数据进行聚合、转换和过滤。数据的分组和聚合是数据分析中常用的分析手段,转换和过滤是数据处理中可用到的方法。

数据集及源代码见:https://github.com/xiejava1018/pandastest.git


作者博客:http://xiejava.ishareread.com/


“fullbug”微信公众号

关注:微信公众号,一起学习成长!

pandas数据处理之合并与拼接

发表于 2022-02-10 | 更新于: 2025-04-08 | 分类于 技术 , 开发 | | 阅读次数:
字数统计: 2.7k | 阅读时长 ≈ 10

在许多应用中,数据可能来自不同的渠道,在数据处理的过程中常常需要将这些数据集进行组合合并拼接,形成更加丰富的数据集。pandas提供了多种方法完全可以满足数据处理的常用需求。具体来说包括有join、merge、concat、append等。

合并与拼接

一般来说

方法 说明
join 最简单,主要用于基于索引的横向合并拼接
merge 最常用,主要用户基于指定列的横向合并拼接
concat 最强大,可用于横向和纵向合并拼接
append 主要用于纵向追加
combine_first 合并重叠数据,填充缺失值
update 将一个数据集的值更新到另一个数据集

下面就来逐一介绍每个方法

一、join

join主要用于基于索引的横向合并拼接
在介绍pandas的join之前我们来看一下SQL对数据集join的几种模式。如果大家对SQL比较熟悉的话应该对SQL操作数据集进行各种合并拼接印象深刻。SQL中各种JOIN的方法如下:
SQL-JOIN

pandas的join实现了left join、right jion、inner join、out jion常用的4中join方法
来自官网的参数说明:

1
2
3
4
5
6
dataframe.join(other,  # 待合并的另一个数据集
on=None, # 连接的键
how='left', # 连接方式:‘left’, ‘right’, ‘outer’, ‘inner’ 默认是left
lsuffix='', # 左边(第一个)数据集相同键的后缀
rsuffix='', # 第二个数据集的键的后缀
sort=False) # 是否根据连接的键进行排序;默认False

我们来看下实例,有两个数据集一个是人员姓名,一个是人员的工资

1
2
left=pd.DataFrame(['张三','李四','王五','赵六','钱七'], index=[3,4,5,6,7],columns=['姓名'])
right=pd.DataFrame([13000,15000,9000,8600,10000], index=[3,4,5,6,8],columns=['工资'])

数据集

注意,left和right的数据集分别都指定了index,因为join主要用于基于索引的横向合并拼接。

1、left join

1
left.join(right)  #默认how='left'

left join

jion操作默认是left jion的操作,可以看到left索引为7姓名为钱七,在right中没有索引为7的对应所以显示left的姓名但right的工资为NaN,right中索引为8的数据在left中没有索引为8的,所以没有显示。left join合并left的数据
left join 如下图所示
left join

2、right join

1
left.join(right,how='right')

right join

右链接合并时可以看到,left的数据集没有索引为8的项,所以索引为8的项显示right数据集的工资数据但姓名为NaN,在left中索引为7的项因为right中不存在,所以没有显示。right join合并right的数据
right join 如下图所示
right join

3、inner join

1
left.join(right,how='inner')

inner join

内链接合并时,可以看到left数据集中的索引为7姓名为钱七因为在right数据集中找不到对应的索引,right数据集中索引为8的在left找不到对应的索引所以内连接合并时索引7和8都没有进行合并,inner join只合并两个数据集共有的数据
inner join 如下图所示
inner join

4、out join

1
left.join(right,how='outer')

out join
外链接合并时,可以看到不管是left中的数据还是right中的数据都进行了合并。right join合并两个数据集中所有的数据。
outer join 如下图所示
outer join
join很简单,但是它有局限性,因为它只能根据索引来合并。不能指定键来进行合并。比如我要根据编号和姓名来合并,join就比较难办了。但是pandas提供了merge的方法,可以指定列来进行合并拼接。

二、merge

merge最常用,主要用户基于指定列和横向合并拼接,语法如下:

1
2
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=True,suffixes=('_x', '_y'), copy=True)
参数名称 说明
left/right 两个不同的 DataFrame 对象。
on 指定用于连接的键(即列标签的名字),该键必须同时存在于左右两个 DataFrame 中,如果没有指定,并且其他参数也未指定, 那么将会以两个 DataFrame 的列名交集做为连接键。
left_on 指定左侧 DataFrame 中作连接键的列名。该参数在左、右列标签名不相同,但表达的含义相同时非常有用。
right_on 指定左侧 DataFrame 中作连接键的列名。
left_index 布尔参数,默认为 False。如果为 True 则使用左侧 DataFrame 的行索引作为连接键,若 DataFrame 具有多层索引(MultiIndex),则层的数量必须与连接键的数量相等。
right_index 布尔参数,默认为 False。如果为 True 则使用左侧 DataFrame 的行索引作为连接键。
how 要执行的合并类型,从 {‘left’, ‘right’, ‘outer’, ‘inner’} 中取值,默认为“inner”内连接。
sort 布尔值参数,默认为True,它会将合并后的数据进行排序;若设置为 False,则按照 how 给定的参数值进行排序。
suffixes 字符串组成的元组。当左右 DataFrame 存在相同列名时,通过该参数可以在相同的列名后附加后缀名,默认为(‘_x’,’_y’)。
copy 默认为 True,表示对数据进行复制。

我们来看下面的数据集,在上面的数据集中left数据集加入了员工的编号,right数据集加入了编号及姓名。索引就按默认的索引。

1
2
3
4
5
left=pd.DataFrame([[3,'张三'],[4,'李四'],[5,'王五'],[6,'赵六'],[7,'钱七']],
columns=['编号','姓名'])

right=pd.DataFrame([[3,'张三',13000],[4,'李四',15000],[5,'王五',9000],[6,'赵六',8600],[8,'孙八',10000]],
columns=['编号','姓名','工资'])

merge数据集

1
pd.merge(left,right)

pd.merge(left,right)

没有指定连接键,默认用重叠列名,没有指定连接方式,默认inner内连接(取left和right编号和姓名的交集)
和join一样通过how来指定连接方式如:

1
pd.merge(left,right,how='left')

pd.merge(left,right,how='left')

how的连接方式和join一样支持left、right、inner、outer
merge还可以指定多个列进行合并链接,也就是和SQL一样设置多个关联的列。

1
pd.merge(left,right,how='outer',on=['编号','姓名'])

merge-out

如果两个对象的列名不同,可以使用left_on,right_on分别指定,如我们把right数据集的“编码”列标签改成“ID”后如果需要left数据集的”编号”和right数据集的”ID”进行关联

1
2
3
right=pd.DataFrame([[3,'张三',13000],[4,'李四',15000],[5,'王五',9000],[6,'赵六',8600],[8,'孙八',10000]],columns=['ID','姓名','工资'])

pd.merge(left,right,how='outer',left_on='编号',right_on='ID')

指定列名关联

虽然说merge已经很强大了,但是pandas愿意给你更多,它提供了concat,可以实现横向和纵向的合并与拼接。也就是说不但实现了SQL中的join还实现了union

三、concat

concat() 函数用于沿某个特定的轴执行连接操作,语法如下:

1
pd.concat(objs,axis=0,join='outer',join_axes=None,ignore_index=False)
参数名称 说明
objs 一个序列或者是Series、DataFrame对象。
axis 表示在哪个轴方向上(行或者列)进行连接操作,默认 axis=0 表示行方向。
join 指定连接方式,取值为{“inner”,”outer”},默认为 outer 表示取并集,inner代表取交集。
ignore_index 布尔值参数,默认为 False,如果为 True,表示不在连接的轴上使用索引。
join_axes 表示索引对象的列表。

来看具体的例子

1
left2=pd.DataFrame([[1,'陈一'],[2,'周二']],columns=['编号','姓名'])

数据集

1、纵向合并

concat默认纵向拼接,我们要在left1数据集的基础上把left2数据集给合并上去,很简单用concat直接就可以合并。

1
df=pd.concat([left,left2])

纵向合并

2、横向合并

1
2
df_outer=pd.concat([left,right],axis=1,join='outer')#外链接
df_inner=pd.concat([left,right],axis=1,join='inner')#内链接

横向合并

注意:因为concat的链接和join一样是通过索引来链接合并,并不能指定通过某个特定的列来链接进行合并,所以看到的合并后的数据集left和right的编号和姓名是错位的。

如果要根据编号来关联可以指定编号作为索引再进行横向合并,这样就没有问题了。

1
2
3
4
left.index=left['编号'].values
right.index=right['编号'].values
df_outer=pd.concat([left,right],axis=1,join='outer')
df_inner=pd.concat([left,right],axis=1,join='inner')

横向合并

四、append

df.append 可以将其他行附加到调用方的末尾,并返回一个新对象。它是最简单常用的数据合并方式。语法如下:

1
df.append(self, other, ignore_index=False,verify_integrity=False, sort=False)

其中:

  • other 是它要追加的其他 DataFrame 或者类似序列内容
  • ignore_index 如果为 True 则重新进行自然索引
  • verify_integrity 如果为 True 则遇到重复索引内容时报错
  • sort 进行排序

来看下面的例子:

1、同结构数据追加

将同结构的数据追加在原数据后面,在left数据集后面追加left2数据集,left2的数据集内容如下:

1
2
left2=pd.DataFrame([[1,'陈一'],[2,'周二']],columns=['编号','姓名'])
left2

append数据集

1
left.append(left2)

append

2、不同结构数据追加

不同结构数据追加,原数据没有的列会增加,没有对应内容的会为空NaN。
如:left3的数据集列有”编号”、”姓名”、”工资”

1
2
left3=pd.DataFrame([[8,'孙八',10000],[9,'何九',15000]],columns=['编号','姓名','工资'])
left3

left3的数据集

1
left.append(left3)

不同结构数据追加

当left后追加left3后的数据集会增加“工资列”,没有对应内容的会为空。

3、追加合并多个数据集

append参数可带数据集列表,可以将多个数据集追加到原数据集
如我们将left2和left3都追加到left

1
left.append([left2,left3])

追加合并多个数据集

五、combine_first

combine_first可用于合并重复数据,用其他数据集填充没有的数据。如一个DataFrame数据集中出现了缺失数据,就可以用其他DataFrame数据集中的数据进行填充。语法格式如下:

1
combine_first(other) #只有一个参数other,该参数用于接收填充缺失值的DataFrame对象。

如left数据集中没有”工资”的数据,我们可以用right数据集有的数据去填充left数据集中的数据。

1
left.combine_first(right) #用right去填充left

combine_first

六、update

update和combine_first比较类似,区别在于:
1、填充合并方式稍有差异
combine_first:如果s1中c的值为空,用s2的值替换,否则保留s1的值
update:如果s2中的值不为空,那么替换s1,否则保留s1的值
2、update是更新原数据,combine_first会返回一个填充后的新数据集,对原数据不做更新。

1
left.update(right) #用right的数据更新left中的数据。

update

至此,本文介绍了pandas的多种数据合并与拼接方法,并介绍了每种方法的异同,通过pandas的数据处理可以应付日常数据处理中大部分的数据处理工作。

数据集及源代码见:https://github.com/xiejava1018/pandastest.git


作者博客:http://xiejava.ishareread.com/


“fullbug”微信公众号

关注:微信公众号,一起学习成长!

pandas基本操作之数据访问(查看与检索)

发表于 2022-02-07 | 更新于: 2025-04-08 | 分类于 技术 , 开发 | | 阅读次数:
字数统计: 1.8k | 阅读时长 ≈ 7

对于数据分析来说,在构造或载入数据后最基本的操作应该就是对数据的访问了。看一看数据的结构、组成、分布等,根据需要从数据集中检索提取出相应的数据。pandas作为数据分析的利器,当然提供了多种查看和检索数据的方法。本文就来捋一捋pandas基本的数据访问。

数据访问

一、查看数据

当我们拿到数据集后,第一步可能就是查看数据了,一方面是了解拿到的数据集的数据结构,另一方面随机检查一下数据的质量问题。
不管是Series还是DataFrame的数据集pandas常用的数据查看方法有:

方法 操作 结果
head(n) 查看数据集对象的前n行 Series或DataFrame
tail(n) 查看数据集的最后n行 Series或DataFrame
sample(n) 随机查看n个样本 Series或DataFrame
describe() 数据集的统计摘要 Series

以下就以一个DataFrame数据集为例来看看这些查看数据的方法。

1
2
3
4
import numpy as np
import pandas as pd
df = pd.read_excel('D:\\Python\\study\\pythontest\\pandastest\\数据集\\staff.xlsx')
df

studend数据集

1、查看头部 head(n)

head()方法如果不带参数,默认返回前5条记录,带了参数n就返回前n条记录。

1
2
df.head() #默认查看前5条记录
df.head(8) #指定查看前8条记录

查看头部 head(n)

2、查看尾部 tail(n)

同样tail()方法如果不带参数,默认返回后面5条记录,带了参数n就返回后面n条记录。

1
2
df.tail() #默认查看后面5条记录
df.tail(4) #指定查看后面4条记录

查看尾部 tail(n)

3、随机查看样本 sample(n)

sample() 不带参数会随机返回一条样本数据,带了参数n就会随机返回n条记录。

1
2
df.sample() #随机查看一条记录
df.sample(4) #随机查看4条记录

随机查看样本 sample(n)

4、查看统计摘要

df.describe() 返回所有数字列的统计摘要。
查看统计摘要

这里连staff_id的统计摘要就显示出来了,因为它是数字列。如果只看某一列的统计摘要

1
df[['staff_salary']].describe()

只看某一列的统计摘要

二、检索数据

在数据分析过程中,很多时候需要从数据表中提取出相应的数据,而这么做的前提是需要先“检索”出这一部分数据。虽然通过 Python 提供的索引操作符”[]”和属性操作符”.”可以访问 Series 或者 DataFrame 中的数据,但这种方式只适应与少量的数据,为了解决这一问题,pandas 提供了多种类型的索引方式来实现数据的访问。包括[]、loc\iloc、at\iat、布尔索引
一般的:
df[‘name’] #会返回本列的Series
df.name #也会返回本列的Series

但是要注意,name应该是一个合法的python变量时才可以直接作为属性来使用。

如:
df[‘1级别’]可以正常返回索引列为“1级别”的数据,而df.1级别会报错,因为”1级别”不是一个合法的python变量。
列索引检索
以下通过DataFrame数据集来说明常用检索数据的方法。对于DataFrame的数据集来说要检索数据通常是确定数据所在的行和列。而确定行和列也有两种方式,一是通过标签索引来确定,二是通过数据所在的位置来确定。
一般的:

操作 语法 返回结果
选择列 df[col] Series
按索引选择行 df.loc[label] Series
按位置选择行 df.iloc[loc] Series
使用切片选择行 df[2:5] DataFrame
用表达式筛选行 df[bool] DataFrame

1、切片[]

通过[]进行检索,这将会对行进行切片

1
df[0:3] #通过切片检索行数据

在这里插入图片描述

切片并不对列有效,如果是df[0:3][1:2],会检索出0-3行,再在这三行切片的基础上切片中检索出第二行。
df[0:3][1:2]

如果要在切片检索的结果上再选择列,则可以通过列标签索引列表来选择

1
df[0:3][['staff_id','staff_name','staff_gender']] #通过列标签索引列表检索列数据

通过列标签索引列表来选择

2、loc\iloc

loc

df.loc[] 只能使用标签索引,不能使用位置索引。当通过标签索引的切片方式来筛选数据时,它的取值前闭后闭,也就是只包括边界值标签(开始和结束)
.loc[] 具有多种访问方法,如下所示:

  • 一个标量标签
  • 标签列表
  • 切片对象
1
2
3
4
5
df.loc[1] #标量标签,返回该行标签的Series数据
df.loc[[1,3]] #标签列表,返回标签列表的行DataFrame数据
df.loc[0:3] #切片对象,返回切片的行DataFrame数据
df.loc[0:3,'staff_id':'staff_salary'] #根据行切片,列切片检索数据
df.loc[[0,1,2,3],['staff_id','staff_name','staff_age']] #根据行标签列表,列标签列表检索数据

loc

.loc[] 除了标量标签,标签列表和切片对象都接受两个参数,并以’,’分隔。第一个位置表示行检索,第二个位置表示列检索
loc2

iloc

df.iloc[] 只能使用位置索引(用整数表示所在行或列的位置如第几行第几列),不能使用标签索引,通过整数索引切片选择数据时,前闭后开(不包含边界结束值)。同 Python 和 NumPy 一样,它们的索引都是从 0 开始
.iloc[] 提供了以下方式来选择数据:

  • 整数索引
  • 整数列表
  • 数值范围

为了说明方便,我们把数据集的行索引重名为字母

1
2
df=df.rename(index={0:'A',1:'B',2:'C',3:'D',4:'E',5:'F',6:'G',7:'H',8:'I',9:'J'})
df

reanme

1
2
3
4
df.iloc[1]  #整数标量选择,数据从0开始,为1的就是第二行的数据,返回的是Series
df.iloc[[1,3]] #整数列表选择,选择位置为1和3的数据,返回的是DataFrame
df.iloc[1:3] #切片选择,选择位置1至2的数据,不包含边界结束值,也就是不包含3的位置
df.iloc[1:3,1:4] #切片选择位置为1至3的行和1至4的列不含位置为3的行和位置为4的列

iloc

3、at\iat

at和iat和loc和iloc类似,不同的是at和iat仅取一个具体的值,结构为 at[<索引>,<列名>],iat[<行位置>,<列位置>]

1
2
df.at['A','staff_name']  #检索第“A”行的列标签为"staff_name"的数据
df.iat[0,1] #检索第1行第2列的数据

at\iat

4、布尔条件检索

1、[] 里用布尔条件进行检索

如:

1
df[(df.staff_salary>10000)&(df.staff_age<40)]  #检索staff_age小于40且staff_salary>10000的数据

[] 里用布尔条件进行检索

2、loc索引部分用布尔条件检索

如:

1
df.loc[(df.staff_salary>10000)&(df.staff_age<40)]  #检索staff_age小于40且staff_salary>10000的数据

loc索引部分用布尔条件检索

3、query函数布尔条件检索

如:

1
df.query('staff_salary>10000 & staff_age<40') #通过函数检索staff_age小于40且staff_salary>10000的数据

query函数布尔条件检索

至此,本文介绍了pandas常用的数据访问操作通过head()、tail()、sample()、describe()查看数据,通过[]、loc\iloc、at\iat、及布尔条件检索数据。通过灵活运用pandas的各种数据访问方法可以很方便的根据需要查看和检索数据。

数据集及源代码见:https://github.com/xiejava1018/pandastest.git


作者博客:http://xiejava.ishareread.com/


“fullbug”微信公众号

关注:微信公众号,一起学习成长!

pandas数据处理之数据转换(映射map、替换replace、重命名rename)

发表于 2022-02-04 | 更新于: 2025-04-08 | 分类于 技术 , 开发 | | 阅读次数:
字数统计: 1.6k | 阅读时长 ≈ 6

我们在数据处理的过程中经常碰到需要对数据进行转换的工作,比如将原来数据里的字典值根据字典转义成有意义的说明,将某些数据转换成其他的数据,将空值转换成其他值,将数据字段名进行重命名等。pandas作为数据处理分析的利器当然为上述的这些数据转换提供了便捷的方法。我们可以利用pandas提供的映射、替换、重命名等操作方便的进行相应的数据转换操作。

本文通过实例重点介绍pandas常用的数据转换工具映射map()、替换replace()、重命名rename()

映射:map()函数 对数据集Serice中的元素根据映射关系进行映射(作用于Serice或DataFrame对象的一列)
替换:replace()函数 替换元素 (作用于DataFrame)
重命名:rename()函数 替换索引 (作用于index或columns)

一、映射 map()

在平时数据处理的过程中常常会碰到,某个字段(数据列)是数字表示的要根据映射表转换成有意思的字符。如性别在数据集里存的是1和2分别表示“男”和“女”,如何将数据集中“性别”列的1和2替换成“男”和“女”如何做?绝对不能用for循环一个个去替换。pandas也好、Numpy也好,都是针对数据集处理的,我们应该抛弃以前针对单个数据处理的思维去拥抱针对数据集来编程。使用pandas的map()方法,最少仅需一行代码就可以解决。
map() 函数是做用于 Series 或 DataFrame 对象的一列,它接收一个函数或表示映射关系的字典做为参数,它的基本语法格式以下:

1
Series.map(arg,na_action=None)

函数中的参数说明以下:

  • arg:接收 function、dict 或 Series,表示映射关系;
  • na_action:类似R中的na.action,取值为None或ingore,用于控制遇到缺失值的处理方式,设置为ingore时串行运算过程中将忽略Nan值原样返回。

下面通过实例来说明pandas的map()的使用,演示的student数据集如下:

1
2
3
4
import numpy as np
import pandas as pd
df = pd.read_excel('D:\\Python\\study\\pythontest\\pandastest\\数据集\\student.xlsx')
df

student数据集

1、通过数据字典映射

map()方法接受数据字典参数,通过数据字典将数据进行映射。如我们需要将“性别”列的1和2替换成“男”和“女”,定义一个数据字典{1:’男’,2:’女’},将1映射成“男”,将2映射成“女”。

1
2
3
gender_map={1:'男',2:'女'}
df['性别']=df['性别'].map(gender_map)
df

数据字典映射
可以看到通过map()将需要转换的列的值进行的转换,具体的转换过程如下图所示:
map转换过程

2、lambda函数映射

map()方法还接受lambda函数的方式进行值的映射,如我们现在要把数学分数为95分以上的映射数学等级为“优秀”,95及以下的映射为“良好”。可以通过lambda函数进行映射。

1
2
df['数学等级']=df['5-数学'].map(lambda x:'优秀' if x>95 else '良好')
df

lambda函数映射

3、通用函数映射

map()方法可以接收自定义通用的函数进行值的映射,如我们现在要把语文分数为95以上的映射为语文等级为“优秀”,95及以下的映射为“良好”,也可以通过自定义函数来实现映射。
先定义一个函数score(x)用于接收需要映射的值。

1
2
3
4
5
6
7
8
def score(x):
score_class='良好'
if x>95:
score_class='优秀'
return score_class

df['语文等级']=df['4-语文'].map(score)
df

函数映射

二、替换 replace()

如果要对全DataFrame数据集中的数据进行某种替换,map()可能需要对数据集中的每个列都进行map()操作才可以,但是通过pandas的替换方法replace可以一次性替换掉DataFrame中所有的数据。如:我们现在要将数据集中所有的“良好”替换成“良”,所有的“优秀”替换成“优”
可以直接通过 df.replace(['优秀','良好'],['优','良']) 一句代码搞定。
替换

以前文章中介绍了处理缺失值用fillna的方式来填充缺失值,用replace则提供了一种更加简单、灵活的处理缺失值或异常值的方式。
如在数据集中有一个数据列“是否接种”,这里的值有“已”、“是”、“否”、NaN,实际是在收集统计表格的时候大家填的数据不一致,不标准。现在需要将“已”的全部改成“是”,NaN没有填的改成“否”

1
df.replace(['已',np.nan],['是','否'])

填充缺失值

三、重命名 rename()

在数据处理的过程有时候需要对列索引进行重命名,一个典型的例子就是对于数据的检索或其他操作df[column]对于任意列名均有效,但是df.column只在列名是有效的Python变量名时才有效。
我们在检索英语大于95分的数据时可以用df[df['6-英语']>95]
英语大于95分的数据

但是用df.query('6-英语 >95') 就会报列名没有定义的错,因为’6-英语’列名不是有效的Python变量名。
报列名没有定义的错

这时候就需要将列名重命名为有效的Python变量名,有效的Python变量名应该是只能_,数字,字母组成,不可以是空格或者特殊字符(!@#$%^&*~),不能是数字开头,不能有中文。我们将“6-英语”的列名重命名为“english”。注意带上inplace=True参数用于更新作用于本数据集,而不是返回一个新的数据集。

1
2
df.rename(columns={'6-英语':'english'},inplace=True)
df.query('english > 95')

重命名
可以看到“6-英语”列名改成了“english”,并且df.query(‘english > 95’)不报错,可以正常检索出数据了。
更多的,如果要重命名多个列,可以传入一个需要重命名的多个字典值,进行多个列的重命名。

1
df[['1-学号','2-姓名','3-年龄']].rename(columns={'1-学号':'ID','2-姓名':'name','3-年龄':'age'})

多个列重命名

如果需要重命名行索引,可以通过df.rename(index={‘原索引’:’重命名索引’})的方式进行重命名。

至此,本文通过几个实例介绍了pandas常用的数据转换工具映射map()、替换replace()、重命名rename()

数据集及源代码见:https://github.com/xiejava1018/pandastest.git


作者博客:http://xiejava.ishareread.com/


“fullbug”微信公众号

关注:微信公众号,一起学习成长!

pandas数据分析之数据运算(逻辑运算、算术运算、统计运算、自定义运算)

发表于 2022-02-03 | 更新于: 2025-04-08 | 分类于 技术 , 开发 | | 阅读次数:
字数统计: 2k | 阅读时长 ≈ 7

数据分析离不开数据运算,在介绍完pandas的数据加载、排序和排名、数据清洗之后,本文通过实例来介绍pandas的常用数据运算,包括逻辑运算、算术运算、统计运算及自定义运算。

一、逻辑运算

逻辑运算是程序代码中经常用到的一种运算。pandas的逻辑运算与Python基础语法中的逻辑运算存在一些差异。pandas的逻辑运算主要用于条件过滤根据条件逻辑运算得出的结果过滤检索出相应的数据。
我们来看一些例子:
数据集为学生数据集

1
2
3
4
import pandas as pd
import numpy as np
df = pd.read_excel('D:\\Python\\study\\pythontest\\pandastest\\数据集\\student.xlsx')
df

学生数据集
我们要过滤检索出语文成绩大于95分的数据,通过df['4-语文']>95的条件语句,可以得到一个结果为bool值的Series,True表示满足语文成绩>95分的,False表示不满足语文成绩>95的。
在pandas中,将Series与数值进行比较,会得到一个与自身形状相同且全为布尔值的Series,每个位置的布尔值对应该位置的比较结果。
这种进行比较的代码,返回值是布尔值,是一种布尔表达式,也可以被称为逻辑语句,只要代码返回的结果是布尔值,都可以把代码当成逻辑语句。
语文大于95的逻辑运算
根据逻辑语句的布尔值,可以用来对数据进行筛选,按我们的需要从大量数据中过滤出目标数据。如我们要过滤出语文成绩大于95的数据,就可以用上述逻辑语句的布尔值进行筛选。

1
df[df['4-语文']>95]

语文大于95的结果

除了直接的比较,pandas中有很多函数都会返回布尔值,如all(),any(),isna()等对整个DataFrame或Series的判断结果,eq(),ne(),lt(),gt()等比较函数的结果,都是布尔值。
逻辑语句是为逻辑运算服务的,可以直接作为判断条件。在复杂的逻辑关系中,需要使用复合逻辑运算,用逻辑运算符来连接多个逻辑语句,复合逻辑运算包含:逻辑与&、逻辑或|、逻辑非~。

逻辑与&

pandas中用符号 & 表示逻辑与,连接两个逻辑语句,同时为真才为真。在Python基本语法中,使用 and 表示逻辑与,但是Pandas中只能用 & ,不能用and,会报模糊错误。
如我们要检索出一班并且语文成绩大于95的数据。可以用 df[(df['4-语文']>95) & (df['班级']=='一班')]
注意两个条件逻辑语句要分别用()括起来然后再用逻辑运算符进行运算。
逻辑与&

逻辑或|

pandas中用符号 | 表示逻辑或,连接两个逻辑语句,只要其中一个为真就为真。
在Python基本语法中,使用 or 表示逻辑或,但是Pandas中只能用 | ,不能用or。
如我们要检索出语文成绩大于95或英语成绩大于96的数据

1
df[(df['4-语文']>95)|(df['6-英语']>96)]

逻辑或|

逻辑非~

pandas中用符号 ~ 表示逻辑非,对逻辑语句取反。
在Python基本语法中,使用 not 表示逻辑非,但是Pandas中只能用 ~ ,不能用not。
如我们要检索出数据成绩>98并且不是一班的同学

1
df[(df['5-数学']>98) & ~(df['班级']=='一班')]

逻辑非~

当然也可以用

1
df[(df['5-数学']>98) & (df['班级']!='一班')]

逻辑不等于

二、算术运算

pandas最重要的一个功能是,它可以对不同索引的对象进行算术运算也就是(+、-、*、\)。
常见的算术云算是加法+运算,如果相加的对象是标量,则数据对象通过广播机制,每个数据值都+标量。如果相加的对象是数据对象则按索引进行算术运算。
通过一个数据集来看一下

1
2
3
4
import pandas as pd
import numpy as np
data1=pd.DataFrame(np.arange(16).reshape((4,4)),columns=['列1','列2','列3','列4'])
data1

数据运算数据集

1、使用算术运算符

和标量计算,标量运算会在算术运算过程中传播。

1
2
data2=data1+1
data2

加标量
可以看到数据集中每个值都+1了
和索引相同的数据对象运算,对每个数据值进行算术运算

1
2
3
data3=pd.DataFrame(np.arange(16).reshape((4,4)),columns=['列1','列2','列3','列4'])
data4=data2+data3
data4

DataFrame相加

在将对象相加时,如果存在不同的索引就是该索引对的并集。自动的数据对齐操作在不重叠的索引引入NA值。缺失值会在算术运算过程中传播。

1
2
data5=pd.DataFrame(np.ones([3,3]),columns=['列1','列2','列3'])
data5

全为1的数据集

1
2
data6=data4+data5
data6

形状不同的数据集相加

2、使用算数运算函数

算数运算函数包括add、sub、div、mul等对应于算术运算符如下:

方法 说明
add,radd 用于加法(+)的方法
sub,rsub 用于减法(- )的方法
div,rdiv 用于除法(/)的方法
floordiv,rfloordiv 用于底除(//)的方法
mul,rmul 用于乘法(* )的方法
pow,rpow 用于指数(**)的方法

加法:

在对不同索引的对象进行算术运算时,如果希望当一个对象中某个轴标签在另一个对象中找不到时填充一个特殊值比如0,可以通过算术方法进行填充,然后再相加。
加法函数
上面的例子展示了,因为data5的行索引为3和列索引为列4用0填充后再相加所以行索引为3和列索引为列4的值是data4的值+0

减法:

1
data4.sub(1)

sub函数

乘法:

1
data4.mul(2)

mul函数

除法:

div函数

三、统计运算

统计运算就是我们常用的数据集的求和、算平均值、最大值、最小值、绝对值、标准差等统计数据。在pandas中提供了丰富的统计函数可以方便的进行统计运算。

1、describe汇总描述统计

通过np.random.randn(1000,4)生成1000个正态分布的随机数据集看一下describe的汇总描叙统计。
包含了数据个数count、均值mean、标准差std、最小值min、最大值等。

1
2
3
#1000个正态分布的随机数统计信息
data=pd.DataFrame(np.random.randn(1000,4))
data.describe()

describe汇总描述统计

2、统计函数

pandas常用统计函数如下:
常用统计函数

1
data.max()

max函数

可以算出DataFrame中每一列的最大值

如果只需要计算某一列的最大值

1
data[1].max()

计算某一列的最大值

对单个函数进行统计的时候,坐标轴还是按照这些默认为columns(axis=0, default),如果要对index进行统计,则要指明(axis=1) 这里的axis取值与axis=0对应index,axis=1对应columns不同

  • 使用0值表示沿着每一列或行标签\索引值向下执行方法
  • 使用1值表示沿着每一行或者列标签模向执行对应的方法
    axis=1

如果要计算某一行的最大值
用data.loc[0].max(),通过loc[]检索出需要统计的行,再用统计函数进行统计
计算某一行的最大值
累计统计cumsum,计算前n个数的和
计算前n个数的和

四、自定义运算

如果常用的统计运算还不能满足,pandas提供了方法可以进行自定义运算。

apply(func, axis=0)

  • func – 自定义函数 axis=0 – 默认是列(按行标签方向执行方法)
  • axis=1为对行进行运算(按列标签方向执行方法)

如:自定义一个对列求max-min的函数
head()
通过lambda匿名函数

1
data.apply(lambda x: x.max() - x.min()) # lambda为匿名函数,x为自变量,冒号后面为函数表达式

lambda匿名函数

通过自定义函数

1
2
3
#自定义函数
def maxdivmin(x):
return x.max()-x.min()

自定义函数
至此,本文通过实例简单介绍了pandas数据分析的数据运算包括逻辑运算、算术运算、统计运算、自定义运算,也是平时在实际应用中常用的运算。

数据集及源代码见:https://github.com/xiejava1018/pandastest.git


作者博客:http://xiejava.ishareread.com/


“fullbug”微信公众号

关注:微信公众号,一起学习成长!

pandas数据清洗之处理缺失、重复、异常数据

发表于 2022-02-02 | 更新于: 2025-04-08 | 分类于 技术 , 开发 | | 阅读次数:
字数统计: 1.7k | 阅读时长 ≈ 6

在数据分析和建模的过程中,有相当多的时间要用在数据准备上:加载、清理、转换以及重塑。这些工作会占到分析师时间的80%或更多。幸运的是pandas和内置的Python标准库提供了高效、灵活的工具可以帮助我们轻松的做这些事情。

本文重点介绍通过pandas进行数据的清洗。数据处理中的清洗工作主要包括对需要分析的数据集中的缺失值(空值)、重复值、异常值的处理。对于数据清洗一般也是分两个步骤,第一步就是要很方便快速的找到需要处理的数据,如何快速找到数据中的缺失值(空值)、重复数据或异常的数据,第二步是对找到的数据根据自己的实际使用需求进行处理,如删除还是替换成其他的数据。
pandas数据清洗

一、处理缺失值

在许多数据分析工作过程中,由于对数据质量问题,缺失数据是经常发生的。对于数值数据,pandas使用浮点值NaN(Not a Number)表示缺失数据。在pandas中,还采用了R语言中惯用的缺失值表示法NA,它表示不可用not available。在统计应用中,NA数据可能是不存在的数据或虽然存在但是看不到。进行数据清洗对缺失数据进行分析,以判断数据采集的问题或缺失数据导致的偏差。

1、判断缺失值(空值)

在pandas中通过isna()或isnull()方法判断空值,二者等价,用于判断一个series或dataframe各元素值是否为空的bool结果。需注意对空值的界定:即None或numpy.nan才算空值,而空字符串、空列表等则不属于空值;类似地,notna()和notnull()则用于判断是否非空。
看下实例:

1
2
3
4
import pandas as pd
import numpy as np
stud_data=pd.Series(['张三','李四',np.nan,[],'',None,'王五'])
stud_data

通过stud_data.isnull()和stud_data.isna()分别来判断空值
判断空值

类似地,notna()和notnull()则用于判断是否非空
判断是否非空
同样的对于DataFrame中的缺失数据判断也是一样的。
构建DataFrame

1
2
stud_df=pd.DataFrame(stud_data,columns=['student_name'])
stud_df

DataFrame中的缺失数据判断

对于缺失值的处理有两种常用的方式,一是用按一定的策略对空值进行填充,二是对于缺失值干脆进行删除。

2、填充缺失值(空值)

pandas中用户填充缺失值的方法是fillna(),可以按一定的策略对空值进行填充,如常数填充、向前/向后填充等,也可通过inplace参数确定是否本地更改。

1.常量填充

1
stud_df[['student_name']].fillna('某某')

常量填充

可以看到判断为缺失值的地方都填充了”某某”,因为空字符串和空列表都不是缺失值,所以没有填充。

2.向前和向后填充NA

通过fillna(mathod=’ffill’),mathod=’ffill’ 向前填充和 mathod=’bfill’ 向后填充,也就是说用前面的值来填充NA或用后面的值来填充NA
我们来增加一列性别列gender来看一下。

1
2
3
4
stud_gender_data=pd.Series([1,0,np.nan,'女',1,None,'男'])
stud_df['gender']=stud_gender_data
stud_df
stud_df[['gender']].fillna(method='ffill')

向前和向后填充NA

可以看到通过method=’ffill’,将NaN和None前面的值填充端到了NaN和None。
用fillna()进行填充会返回一个填充好的数据集的副本,并没有对原始数据进行操作,如果要修改原始数据可以通过inplace参数确定是否本地更改。
通过inplace参数确定是否本地更改

3、删除缺失值(空值)

如果想删除缺失值,那么使用 dropna() 函数与参数 axis 可以实现。在默认情况下,按照 axis=0 来按行处理,这意味着如果某一行中存在 NaN 值将会删除整行数据。如果在dropna()中传入how='all'将只会删除全为NA或NaN的行。示例如下:
删除缺失值(空值)

二、处理重复值

重复数据也是在实际数据处理过程中碰到比较多的,处理重复数据就是在数据集中找出重复数据然后将其删除保留一个唯一不重复的数据。

1、检测重复值

pandas通过duplicated()方法检测各行是否重复,返回一个行索引的bool结果,可通过keep参数设置保留第一行、最后一行、无保留,例如keep=first意味着在存在重复的多行时,首行被认为是合法的而可以保留。
构造一个DataFrame来看一个实例:

1
2
3
data=pd.DataFrame({'key1':['A','B']*3+['B'],'key2':[1,1,2,3,3,4,4]})
data
data.duplicated()

检测重复值

2、删除重复值

pandas通过drop_duplicates()方法按行检测并删除重复的记录,也可通过keep参数设置保留项。由于该方法默认是按行进行检测,如果存在某个需要需要按列删除,则可以先转置再执行该方法。

1
data.drop_duplicates()

删除重复值
可以看到第7行也就是index为6的重复行被删除了。
当带了keep='last'参数时,保留最后一个重复项,前面的重复项将被丢弃。可以看到保留的是索引为6的,索引为5的重复项被丢弃了。
保留最后一个重复项

三、处理异常值

1、判断异常值

判断异常值的标准依赖具体分析数据,如大于或小于某个基线范围的值。
我们来看一个含有正态分布的DataFrame数据集

1
2
data=pd.DataFrame(np.random.randn(1000,4))
data.describe()

含有正态分布的DataFrame数据集

假设我们认为某列中绝对值大小超过3的是异常值,那么判断异常值就是要找出某列中大小超过3的值。

1
data[np.abs(col)>3]

找出某列中大小超过3的值

要选出全部含有绝对值大小超过3的行,可以在布尔型DataFrame中使用any()方法。

1
data[(np.abs(data)>3).any(1)]

全部含有绝对值大小超过3的行

2、替换异常值

对于异常值,可以直接替换。
如:

1
data[np.abs(data)>3]=np.sign(data)*3

这样就可以将异常值替换为绝对值不大于3的
替换异常值

3、删除异常值

删除异常值,可以用pandas的drop()方法,接受参数在特定轴线执行删除一条或多条记录,可通过axis参数设置是按行删除还是按列删除
如删除第3列,列索引为2的列中绝对值>3的行

1
2
col=data[2]
data.drop(data[np.abs(col)>3].index,inplace=True)

删除异常值

可以看到本来有1000行的,删除了3行,再用data[np.abs(col)>3]验证,已经找不到数据了。

至此,本文通过实例介绍了pandas进行数据清洗包括缺失值、重复值及异常值的处理。数据清洗是数据分析前面的准备工作,数据质量的好坏将直接影响数据分析的结果。


作者博客:http://xiejava.ishareread.com/


“fullbug”微信公众号

关注:微信公众号,一起学习成长!

<1…141516…20>
XieJava

XieJava

200 日志
11 分类
25 标签
RSS
GitHub
友情链接
  • 爱分享读书
  • CSDN
  • 豆瓣
© 2025 XieJava | Site words total count: 415.3k

主题 — NexT.Muse
0%