XieJava's blog

记录最好的自己


  • 首页

  • 分类

  • 标签

  • 归档

  • 关于

什么是用户实体行为分析(UEBA)

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

一、背景

数字新时代正在加速全面到来,网络环境变得更加多元、人员变得更复杂、接入方式多种多样,网络边界逐渐模糊甚至消失,同时伴随着企业数据的激增。数字化转型促进组织的业务发展的同时,也带来了重大的网络安全挑战。
1.越来越多的外部攻击,包括被利益驱动或国家驱动的难以察觉的高级攻击;
2.心怀恶意的内鬼、疏忽大意的员工、失陷账号与失陷主机导致的各种内部威胁;
3.数字化基础设施的脆弱性和风险暴露面越来越多,业务需求多变持续加剧的问题;
4.安全团队人员不足或能力有限,深陷不对称的“安全战争”之中。
在数字化带来的巨大变化下,传统的安全威胁发现能力受到了巨大的挑战。传统安全产品、技术、方案基本上都是基于已知特征进行规则匹配来进行分析和检测,基于特征、规则和人工分析,以“特征”为核心的检测分析存在安全可见性盲区,有严重的滞后效应、无力检测未知攻击、容易被绕过,以及难以适应攻防对抗的网络现实和快速变化的企业环境、外部威胁等问题。
特征分析与行为分析

安全是人和人攻防对抗的游戏,一切的意图都需要通过行为表达,这是安全运营中最重要也最有价值的一块拼图,同时也是传统方式最欠缺的。针对传统方式的不足,安全行业逐步加强基于大数据驱动,机器学习、概率分析、模式识别等的以“行为”为核心的检测分析。
用户实体行为分析(UEBA)应运而生。

二、UEBA是什么

UEBA全名User and Entity Behavior Analytics ,即为用户实体行为分析。
Gartner 对 UEBA 的定义是“UEBA 提供画像及基于各种分析方法的异常检测,通常是基本分析方法(利用签名的规则、模式匹配、简单统计、阈值等)和高级分析方法(监督和无监督的机器学习等),用打包分析来评估用户和其他实体(主机、应用程序、网络、数据库等),发现与用户或实体标准画像或行为相异常的活动所相关的潜在事件。这些活动包括受信内部或第三方人员对系统的异常访问(用户异常),或外部攻击者绕过安全控制措施的入侵(异常用户)

用户行为分析(UBA)关联了用户活动和相关实体(用户相关的应用和终端等)信息构建人物角色与群组,进一步定义这些个体与群组的合法和正常行为,把这些人物角色在群体与群体、群体与个体、个体与个体(那些远离合法和正常行为的群体与个体)维度上相互比对分析,将异常用户(失陷账号)和用户异常(非法行为)检测出来,从而达到检测业务欺诈、敏感数据泄露、内部恶意用户、有针对性攻击等高级威胁的目的。

三、UEBA应用场景

1 账号安全

内部员工特别是高权限用户,以及服务和共享类帐户是内部和外部攻击者的主要目标。通过获取他们的访问权限则能够访问最敏感的交易、数据,甚至可以创建其他新特权帐户或滥用提权操作。由于公司账号数量庞大且难以区分滥用和合法使用,组织在监控这些帐户时面临着巨大的挑战。有效监控特权帐户不仅是一项重要的合规性要求,而且还是一项关键的威胁管理功能。和专有的特权账号管理应用(PAM,Privileged Account Management),PAM类应用提供了特权账号的全生命周期管理,而对特权账号异常行为的监控、检测、分析则是PAM的一类高级功能。PAM 内置的特权账号异常检测能力相对较弱,所以一些 PAM 供应商会跟 UEBA 产品集成,将 PAM 检测到的异常事件接入 UEBA 产品的高级分析引擎中,和其他维度的数据一起做更深层次的特权账号异常事件识别。
细分账号安全的场景,大致有两类。一类是账号本身的操作异常,如创建、提权、删除、暂停、撤回存在异常行为,静默账号忽然出现活动。另一类通过对账号行为如登录的时间、地点、频次的异常监控,判断账号是否被盗用或被攻陷。

2 内部威胁

相比于不受信任的外部人员,内部员工访问和获取公司重要信息的要轻松很多。一方面公司的大部分安全防护、访问控制都是针对外来的攻击者;另一方面内部人员对组织的人员、规章、制度都有一定程度的了解,从而可以利用这些便利性来躲过安全防护检测。内部威胁者通常分为两类,一类是恶意内部人员,即合法的人员利用自己的权限做非法的事情。比如,下载大量重要的客户数据贩卖获取利益。另一类是内部人员账号被攻陷后的恶意行为。内部威胁检测的场景设计比较复杂,一般会从4个维度来考虑。

  1. 建立用户行为风险画像 - 将所有身份、活动和访问特征,与基线、同组以及其他已知威胁指标进行比较,确定真正的风险区域。
  2. 高权限账号监控 – 自动识别高权限账号,例如管理员、服务和共享帐户,然后监控他们与攻击相关的异常行为,确定高风险异常行为是否源于高权限用户被成功攻击。
  3. 关键应用监控 – 为所有关键应用程序和系统构建访问风险评估,以识别与其敏感数据和交易相关的所有高风险用户、访问和活动。
  4. 内部欺诈侦测 – 利用同组人员的异常行为,比较分析侦测潜在的内部欺诈行为。

3 数据渗漏

一般而言,各类攻击的主要意图是窃取组织中最重要的数据资产。组织一般会部署监控数据流向的 DLP 产品,数据库安全或者应用访问类产品以保护公司的核心数据资产。这类数据防护类产品往往误报很多,每天产生的海量报警让安全团队难以真正聚焦重点。UEBA 可以对应用访问以及 DLP 日志做更深层次的多维分析,从而定位出真正的高风险数据泄漏风险。具体的场景设计可以从以下维度考虑。
应用系统访问监控/风险分析 – 对存储敏感数据的应用系统、文件服务器等的访问进行行为监控,通过与用户过去行为或其同组行为异常行相比较,自动识别并持续监控与此数据相关的高风险访问和活动。
DLP 事件评估 – 将 DLP 事件做多维度关联分析,比如说发生 DLP 事件的人,他的风险等级、是否有离职倾向、敏感数据下载/外发/打印的数量、频次、数据外流的目的地是否为竞争对手等等,从而进一步定位高风险。高风险人群的 DLP 事件优先处置,并且通过多维度分析往往也能进一步定位这些数据泄漏企图背后的动机。

4 失陷主机

除了人员行为异常以外,重要的 IT 资产比如说各种应用服务器、重要的终端等行为异常检测对很多组织也是至关重要。例如,一个重要的应用服务器执行了一个非业务的应用或进程,打开了一个新的端口,外连了从未外连的地址/端口,忽然有长链接的 SSH 会话,系统目录下忽然出现新的可疑文件等等。这些异常行为往往是服务器被攻击的征兆,需要进一步分析与取证。
用 UEBA 技术定位失陷主机通常的思路是,基于相应设备和主机执行的高风险异常事件和活动,建立异常时间线,然后关联各种实体参数,包括:端点安全警报、漏洞扫描结果(常见漏洞评分系统[CVSS])、用户或帐户的风险级别、访问的目标、请求的有效负载的数据包级别等等,从多维度检测任何异常活动或事件以确定风险评分。

四、UEBA主要实现技术

UEBA 是一个完整的系统,涉及到算法、工程等检测部分,以及用户实体风险评分排序、调查等用户交互、反馈。从架构上来看,UEBA 系统一般包含三个层次,分别是数据中心层、算法分析层、场景应用层。其中,算法分析层一般大数据计算平台之上运行实时分析、统计分析、关联分析、机器学习等分析引擎。
UEBA架构

机器学习引擎实现,如基线及群组分析、异常检测、集成学习风险评分、安全知识图谱、强化学习等UEBA 核心技术。

基线及群组分析

历史基线,是行为分析的重要部分,通过构建群组分析,可以跨越单个用户、实体的局限,看到更大的事实;通过对比群组,易于异常检测;通过概率评估可以降低误报,提升信噪比;组合基线分析、群组分析,可以构成全时空的上下文环境。

异常检测

异常检测关注发现统计指标异常、时序异常、序列异常、模式异常等异常信号,采用的技术包括孤立森林、K 均值聚类、时序分析、异常检测、变点检测等传统机器学习算法。现代的异常检测也利用深度学习技术,包括基于变分自编码器(VAE)的深度表征重建异常检测、基于循环神经网络(RNN)和长短时记忆网络(LSTM)的序列深度网络异常检测、图神经网络(GNN)的模式异常检测等。针对标记数据缺乏的现状,某些UEBA 系统能够采用主动学习技术(Active Learning)、自学习(Self Learning),充分发掘标记数据和无标记数据的价值。

集成学习风险评分

把安全运维从事件管理转换到用户、实体风险,极大的降低工作量、提升效率。其中,实现转换的关键在于使用集成学习进行风险评分。风险评分需要综合各种告警、异常,以及进行群组对比分析和历史趋势。同时,风险评分技术中用户间风险的传导同样重要,需要一套类似谷歌搜索使用的网页排名PageRank 算法的迭代评估机制。风险评分的好坏,将直接影响到UEBA 实施的成效,进而直接影响到安全运营的效率。

安全知识图谱

知识图谱已经成为人工智能领域的热点方向,在网络安全中同样也有巨大的应用潜力。部分UEBA 系统已经支持一定的安全知识图谱能力,可以将从事件、告警、异常、访问中抽取出的实体及实体间关系,构建成一张网络图谱。任何一个事件、告警、异常,都可以集成到网络图谱中,直观、明晰的呈现多层关系,可以让分析抵达更远的边界,触达更隐蔽的联系,揭露出最细微的线索。结合攻击链和知识图谱的关系回放,还能够让安全分析师近似真实的复现攻击全过程,了解攻击的路径与脆弱点,评估潜在的受影响资产,从而更好的进行应急响应与处置。

强化学习

不同客户的环境数据源的多元性及差异性,以及用户对异常风险的定义各有不同, UEBA 需要具有一定的自适应性,输出更精准的异常风险。强化学习能够根据排查结果自适应地调整正负权重反馈给系统,进而得到更符合客户期望的风险评分。UEBA 给出异常信号后,结合安全管理人员的排查结果,获取反馈奖赏或惩罚,通过学习进行正负权重调整,从而让整体效果持续优化改进。

五、UEBA行业发展趋势

Gartner《Market Guide for User and Entity Behavior Analytics》报告中指出:
终端用户在UEBA独立解决方案上的支出将呈复合式增长年增长率为48%,从2015年的5,000万美元增长到2020年的3.52亿美元。
UEBA解决方案供应商在2017年和2018年继续减少,主要是由于收购活动。Gartner预计该领域将继续整合,同时在其服务于相邻细分市场的产品中使用UEBA技术的厂商数量也在大幅增加。
到2021年,用户和实体行为分析(UEBA)市场将不再是一个独立的市场。
一些UEBA供应商现在将其市场战略路线聚焦于将其核心UEBA技术嵌入其他供应商的更传统的安全解决方案中。到2022年,UEBA的核心技术将嵌入80%的威胁检测和事件高级解决方案中(如SIEM)。
Gartner认为这一趋势将持续到2022年,届时UEBA将成为被更广泛的安全分析技术所取代。

IndustryARC《UEBA Market - Forecast(2020 - 2025)》报告:
到2025年,用户和实体行为分析市场预计将达到49亿美元,从2020年到2025年,复合年增长率为41.5%。
UEBA是一种用于检测内部风险,财务欺诈和针对性攻击的机制。该方法用于分析人类行为模式,然后使用统计分析和算法来识别差异。
UEBA是一种机器学习模型,可以通过检测保护异常来帮助阻止网络攻击者。UEBA使用高级分析,汇总日志和报告数据,并分析数据包,流,文件和其他类型的信息以及其他类型的威胁数据,以评估某些形式的活动和动作是否可能构成网络攻击。
UEBA的优势包括–内部威胁识别,防止数据泄露,识别和防止欺诈,可操作的风险信息以及IP数据的安全性。
UEBA逐渐成为对全面网络威胁和欺诈的最有希望的回应。软件提供商更专注于确保可靠的算法和集成分析,以及开发应用程序系统。

综合上述报告可以看出:
UEBA市场价值正在飞速上升,UEBA技术研究前景广阔。
UEBA发展方向不再是一个独立个体,而是倾向于将UEBA技术嵌入到其他高级安全解决方案中。


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


“fullbug”微信公众号

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

网络信息安全常用术语

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

网络信息安全术语是获取网络安全知识和技术的重要途径,常见的网络安全术语可以分为基础技术类、风险评估技术类、防护技术类、检测技术类、响应/恢复技术类、测评技术类等。

下面主要介绍常见的网络安全技术方面的术语

一、基础技术类

基础技术类常见的是密码及加解密相关的技术
密码(Cipher)
一种用于加密和解密数据的算法。

密码学(Cryptography)
编码研究。同样,使用代码/密码/数学技术来保护数据并提供实体和数据的身份验证。

密钥(Secret key)
用于加密和解密的加密密钥,使对称密钥加密方案能够运行。

编码(Encode)
使用代码将一种符号转换为另外一种符号。

加密(Encryption)
使用密码来保护信息,这使任何没有密钥对其解密的人都无法读取。

解密(Decryption)
将编码文本解密为原始原始格式的过程。

证书(Certificate)
数字证书是数字身份验证的一种形式,它允许计算机,用户或组织安全地交换信息。

二、攻击技术类

拒绝服务(Denial of Service)
是指通过向 服务器 发送大量垃圾信息或干扰信息的 方式 ,导致服务器无法向正常用户提供服务的现象。

分布式拒绝服务(Distributed Denial of Service)
指处于不同位置的多个攻击者同时向一个或数个目标发动攻击,或者一个攻击者控制了位于不同位置的多台机器并利用这些机器对受害者同时实施攻击。由于攻击的发出点是分布在不同地方的,这类攻击称为分布式拒绝服务攻击。

网页篡改(Website Distortion)
网页篡改是恶意破坏或更改网页内容,使网站无法正常工作或出现黑客插入的非正常网页内容。

网页仿冒(Phishing)
网页仿冒是通过构造与某一目标网站高度相似的页面(俗称钓鱼网站),并通常以垃圾邮件、即时聊天、手机短信或网页虚假广告等方式发送声称来自于被仿冒机构的欺骗性消息,诱骗用户访问钓鱼网站,以获取用户个人秘密信息(如银行账号和账户密码)。

网页挂马(Website Malicious Code)
网页挂马是通过在网页中嵌入恶意代码或链接,致使用户计算机在访问该页面时被植入恶意代码。

域名劫持(DNS Hijack)
域名劫持是通过拦截域名解析请求或篡改域名服务器上的数据,使得用户在访问相关域名时返回虚假IP地址或使用户的请求失败。

路由劫持(Routing Hijack)
路由劫持是通过欺骗方式更改路由信息,以导致用户无法访问正确的目标,或导致用户的访问流量绕行黑客设定的路径,以达到不正当的目的。

垃圾邮件(Spam)
垃圾邮件是将不需要的消息(通常是未经请求的广告)发送给众多收件人。包括:收件人事先没有提出要求或者同意接受的广告、电子刊物、各种形式的宣传品等宣传性的电子邮件;收件人无法拒收的电子邮件;隐藏发件人身份、地址、标题等信息的电子邮件;含有虚假的信息源、发件人、路由等信息的电子邮件。

特洛伊木马(Trojan Horse)
特洛伊木马(简称木马)是以盗取用户个人信息,甚至是远程控制用户计算机为主要目的的恶意代码。由于它像间谍一样潜入用户的电脑,与战争中的 “木马”战术十分相似,因而得名木马。按照功能,木马程序可进一步分为:盗号木马、网银木马、窃密木马、远程控制木马、流量劫持木马和其他木马六类。

网络蠕虫(Network Worm)
网络蠕虫是指能自我复制和广泛传播,以占用系统和网络资源为主要目的恶意代码。按照传播途径,蠕虫可进一步分为:邮件蠕虫、即时消息蠕虫、U盘蠕虫、漏洞利用蠕虫和其他蠕虫五类。

僵尸程序(Bot)
僵尸程序是用于构建僵尸网络以形成大规模攻击平台的恶意代码。按照使用的通信协议,僵尸程序可进一步分为:IRC僵尸程序、Http僵尸程序、P2P僵尸程序和其他僵尸程序四类。

僵尸网络(Bot Net)
僵尸网络是被黑客集中控制的计算机群,其核心特点是黑客能够通过一对多的命令与控制信道操纵感染僵尸程序的主机执行相同的恶意行为,如可同时对某目标网站进行分布式拒绝服务攻击,或发送大量的垃圾邮件等。

SQL注入(SQL injection)
一种使用代码注入来攻击由数据驱动的应用程序的策略。恶意注入的SQL代码可以执行多种操作,包括将所有数据转储到攻击者控制的位置的数据库中。通过这种攻击,恶意黑客可以欺骗身份,修改数据或篡改数据,泄露机密数据,删除和销毁数据或使其不可用。他们还可以完全控制数据库。

网络钓鱼(Phishing)
大量电子邮件要求提供敏感信息或将其推送到假网站。这些电子邮件通常没有针对性。

宏病毒(Macro virus)
一种恶意代码,使用文档应用程序的宏编程功能来执行不当行为,自我复制并在整个系统中传播。

恶意代码(Malicious code)
恶意代码是指在未经授权的情况下,在信息系统中安装、执行以达到不正当目的的程序。旨在损害信息系统的机密性,完整性或可用性。

恶意广告(Malvertising)
使用在线广告投放恶意软件。

恶意软件(Malware)
恶意软件的简称。任何可能对组织或个人造成不利影响的病毒,特洛伊木马,蠕虫,代码或内容。

中间人攻击(MitM)
网络罪犯将自己置于受害者和受害者试图访问的网站之间,以获取正在传输的信息或对其进行更改。有时缩写为MITM,MIM,MiM或MITMA。

逻辑炸弹(Logic bomb)
一段带有一组秘密指令的代码。它被插入系统并由特定操作触发。该代码通常执行恶意操作,例如删除文件。

高级持久威胁(APT)
一种网络攻击,使用复杂的技术持续对目标政府和公司进行网络间谍活动或其他恶意活动。通常由具有丰富专业知识和大量资源的对手进行-通常与民族国家参与者相关。
这些攻击往往来自多个入口点,并且可能使用多个攻击媒介(例如,网络攻击,物理攻击,欺骗攻击)。一旦系统遭到破坏,结束攻击可能非常困难。

被动攻击(Passive attack)
攻击者试图获取机密信息以将其提取。因为他们不尝试更改数据,所以这种类型的攻击更难检测-因此称为“被动”。

密码嗅探(Password sniffing)
通过监视或监听网络流量以检索密码数据来收集密码的技术。

有效载荷(Payload)
执行恶意操作的恶意软件元素–网络安全性等同于导弹的爆炸性电荷。通常说来是造成破坏的。

勒索软件(Ransomware)
勒索软件是一种恶意软件(恶意软件),它对PC或移动设备上的所有数据进行加密,从而阻止数据所有者对其进行访问。感染发生后,受害者会收到一条消息,告知他/她必须支付一定数量的钱(通常以比特币支付)才能获得解密密钥。通常,支付赎金也有时间限制。如果受害者支付赎金,则不能保证解密密钥会被移交。最可靠的解决方案是至少在三个不同的位置备份数据(以确保冗余),并使这些备份保持最新状态,这样您就不会失去重要的进展。

社会工程学(Social engineering)
操纵人们执行特定的动作或泄露对攻击者有用的信息。操纵策略包括谎言,心理技巧,贿赂,勒索,假冒和其他类型的威胁。社交工程通常用于提取数据并获得对信息系统的未授权访问,这些信息系统可以是单个私人用户,也可以是组织的信息系统。

三、防护技术类

访问控制(Access Control)
访问控制是按用户身份及其所归属的某项定义组来限制用户对某些信息项的访问,或限制对某些控制功能的使用的一种技术。

防火墙(Firewall)
网络或设备周围的虚拟边界,用于保护网络或设备免受不必要的访问。可以是硬件或软件。

入侵防御系统(Intrusion Prevention System)
是一部能够监视网络或网络设备的网络资料传输行为的计算机网络安全设备,能够及时的中断、调整或隔离一些不正常或是具有伤害性的网络资料传输行为。

防毒软件(Antivirus)
防病毒软件用于监视计算机或网络,以检测从恶意代码到恶意软件的网络安全威胁。防病毒程序不仅可以警告您威胁的存在,还可以删除或消除恶意代码。

蜜罐(蜜网)Honeypot (honeynet)
诱骗系统或网络,用于吸引潜在的攻击者,通过检测攻击或使攻击发生偏转来保护实际系统。一个学习攻击方式的好工具。多个蜜罐可以组成一个蜜网。

安全信息和事件管理(SIEM)
用于监视,记录,提供警报和分析安全事件以支持威胁检测和事件响应的软件。

安全监控(Security monitoring)
从一系列安全系统中收集数据,并将这些信息与威胁情报进行关联和分析,以识别出受到威胁的迹象。

四、检测技术类

入侵检测(Instrusion Detection)
是一种对网络传输进行即时监视,在发现可疑传输时发出警报或者采取主动反应措施的网络安全设备。

漏洞扫描(Vulnerability Scanning)
是对网络设备及应用服务的可用性、安全性与合规性等进行扫描,发现可利用漏洞的一种安全检测(渗透攻击)行为。

威胁分析(Threat analysis)
对单个威胁的特征进行详细评估。

五、响应/恢复技术类

应急响应(Emergency Response)
应急响应通常是指一个组织为了应对各种意外事件的发生所做的准备工作以及在突发事件发生时或者发生后所采取的措施。

灾难恢复(Disaster Recovery)
灾难恢复也称灾备,指自然或人为 灾害 后,重新启用 信息系统 的 数据 、 硬件 及 软体 设备,恢复正常商业运作的过程。

备份文件(Backup files)
一种用户以后数据恢复的文件

备份(Backup)
为应付文件、数据丢失或损坏等可能出现的意外情况,将电子计算机存储设备中的数据复制到磁带等大容量存储设备中。从而在原文中独立出来单独贮存的程序或文件副本。

应急预案(Contingency plan)
一种关于备份、应急响应和灾后恢复的计划。

灾难恢复计划(Disaster recovery plan)
信息系统灾难恢复过程中所需要的任务、行动、数据和资源的文件,用于指导相关人员在预定的灾难恢复目标内恢复系统系统支持的关键业务功能。

六、评测技术类

评价方案(Evaluation scheme)
针对一个特定的团体,由某一评价机构根据指定标准制定的行政管理的与规章制度的框架。

渗透测试(Penetration testing)
一种旨在探查和暴露信息系统中的安全性弱点以便对其进行修复的测试。

质量评价(Quality evaluation)
对实体满足规定要求程度而进行的系统性检查

威胁评估(Threat assessment)
识别或评估具有或表明可能危害生命,信息,操作和/或财产的实体,动作或事件(自然或人为)的产品或过程。


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


“fullbug”微信公众号

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

网络信息安全基本属性

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

常见的网络信息安全基本属性主要有机密性、完整性、可用性、不可抵赖性和可控性等,其中机密性(Confidentiality)、完整性(Integrity)、可用性(Availability)被称为网络信息系统核心的CIA安全属性,此外还有其他的安全属性包括:真实性、时效性、合规性、隐私性等。

网络信息安全基本属性

机密性

机密性(Confidentiality)是指网络信息不泄露给非授权的用户、实体或程序,能够防止非授权者获取信息。这些信息不仅包括国家机密,也包括企业和社会团体的商业机密和工作机密,还包括个人信息。例如,网络信息系统上传递口令敏感信息,若一旦攻击者通过监听手段获取到,就有可能危及网络系统的整体安全。人们在应用网络时很自然地要求网络能提供保密性服务,而被保密的信息既包括在网络中传输的信息,也包括存储在计算机系统中的信息。就像电话可以被窃听一样,网络传输信息也可以被窃听,解决的办法就是对传输信息进行加密处理。存储信息的机密性主要通过访问控制来实现,不同用户对不同数据拥有不同的权限。

完整性

完整性(Integrity)是指网络信息或系统未经授权不能进行改变的特性。即信息在存储或传输过程中保持不被修改、不被破坏和丢失的特性。数据的完整性是指保证计算机系统上的数据和信息处于一种完整和未受损害的状态,这就是说数据不会因为有意或无意的事件而被改变或丢失。除了数据本身不能被破坏外,数据的完整性还要求数据的来源具有正确性和可信性,也就是说需要首先验证数据是真实可信的,然后再验证数据是否被破坏。影响数据完整性的主要因素是人为的蓄意破坏,也包括设备的故障和自然灾害等因素对数据造成的破坏。

可用性

可用性(Availability)是指合法许可的用户能够及时获取网络信息或服务的特征,即可授权实体或用户访问并按要求使用信息的特性。简单地说,就是保证信息在需要时能为授权者所用,防止由于主客观因素造成的系统拒绝服务。例如,网站能够给用户提供正常的网页访问服务,防止拒绝服务攻击。

不可抵赖性

不可抵赖性也称不可否认性。是指防止网络信息系统相关用户否认其活动行为的特性。在信息交换过程中,确信参与方的真实同一性,即所有参与者都不能否认和抵赖曾经完成的操作和承诺。简单地说,就是发送信息方不能否认发送过信息,信息的接收方不能否认接收过信息。利用信息源证据可以防止发信方否认已发送过信息,利用接收证据可以防止接收方事后否认已经接收到信息。数据签名技术是解决不可否认性的重要手段之一。

可控性

可控性是指网络信息系统责任主体对其具有管理、支配能力的属性,能够根据授权规则对系统进行有效掌握和控制,使得管理者有效地控制系统的行为和信息的使用,符合系统运行目标。是人们对信息的传播路径、范围及其内容所具有的控制能力,如:不允许不良内容通过公共网络进行传输,使信息在合法用户的有效掌控之中

其他

除常见的网络信息系统安全特性,还有真实性、时效性、合规性、公平性、可靠性、可生存性和隐私性等,这些安全特性适用于不同类型的网络信息系统,其要求程度有所差异。

1.真实性

真实性是指网络空间信息与实际物理空间、社会空间的客观事实保持一致性。如,网络谣言信息不符合真实情况,违背了客观事实。

2.时效性

时效性是指网络空间信息、服务及系统能够满足时间约束要求。如,汽车安全驾驶的智能控制系统要求信息具有实时性,信息在规定时间范围内才有效。

3.合规性

合规性是指网络信息、服务及系统符合法律法规政策、标准规范等要求。如,网站内容如何法律法规政策要求等。

4.公平性

公平性是指网络信息系统相关主体处于同等地位处理相关任务,任何一方不占据优势的特性要求。如,电子合同签订双方符合公平性要求,在同一时间签订合同。

5.可靠性

可靠性是指网络信息系统在规定条件及时间下,能够有效完成预定的系统功能的特性。

6.可生存性

可生存性是指网络信息系统在安全受损的情形下,提供最小化、必要的服务功能,能够支撑业务继续运行的安全特性。

7.隐私性

隐私性是指有关个人的敏感信息不对外公开的安全属性,如个人的身份证号码、住址、电话号码、工资收入、疾病状况、社交关系等。

网络攻击是指损害网络系统安全属性的危害行为。危害行为导致网络系统的机密性、可用性、可控性、真实性、抗抵赖性等受到不同程度的破坏。常见的危害行为有四个基本类型:

  • 信息泄露攻击;
  • 完整性破坏攻击;
  • 拒绝服务攻击;
  • 非法使用攻击。

本文整理自《信息安全工程师教程第2版》


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


“fullbug”微信公众号

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

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

发表于 2022-03-07 | 更新于: 2025-07-11 | 分类于 技术 , 网络安全 | | 阅读次数:
字数统计: 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-07-11 | 分类于 技术 , 开发 | | 阅读次数:
字数统计: 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-07-11 | 分类于 技术 , 开发 | | 阅读次数:
字数统计: 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-07-11 | 分类于 技术 , 开发 | | 阅读次数:
字数统计: 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-07-11 | 分类于 技术 , 开发 | | 阅读次数:
字数统计: 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-07-11 | 分类于 技术 , 开发 | | 阅读次数:
字数统计: 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-07-11 | 分类于 技术 , 开发 | | 阅读次数:
字数统计: 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”微信公众号

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

<1…141516…21>
XieJava

XieJava

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

主题 — NexT.Muse
0%