Pandas如何比较缺失值以及转置方向?

Pandas中缺失值是一个不寻常的对象,并且具有非常有趣的数学特性。

目录

《Pandas1.x实例精解》新书抢先看!

【第1篇】利用Pandas操作DataFrame的列与行

【第2篇】Pandas如何对DataFrame排序和统计

【第3篇】Pandas如何使用DataFrame方法链

微信搜索关注《Python学研大本营》,加入读者群,分享更多精彩

比较缺失值

Pandas使用NumPy NaN(np.nan)对象表示缺失值。这是一个不寻常的对象,并且具有非常有趣的数学特性。例如,np.nan对象不等于自身。甚至Python的None对象在与自身进行比较时被评估为True。

>>> np.nan == np.nan 
False
>>> None == None 
True

与np.nan对象进行的所有比较也返回False,当然,不等于(!=)除外。

>>> np.nan > 5 
False
>>> 5 > np.nan 
False
>>> np.nan != 5 
True

做好准备

Series和DataFrame可以使用equals运算符(==)进行逐元素的比较。结果是一个包含相同维度的对象。此秘笈将展示如何使用equals运算符,该运算符与.equals方法有很大的不同。与前面的秘笈一样,我们将使用代表college数据集中各种族本科学生的百分比数  的列。

>>> college = pd.read_csv(
...  "data/college.csv", index_col="INSTNM"
... )
>>> college_ugds = college.filter(like="UGDS_")

实战操作

(1)为了理解equals运算符的工作原理,可以将每个元素与一个标量值进行比较。

>>> college_ugds == 0.0019

(2)这可以按预期工作,但是当你尝试比较包含缺失值的DataFrame时,就会出现问题。对此,你可能很想使用equals运算符来逐个元素地比较两个DataFrame。例如,使用college_ugds与自身进行比较。

>>> college_self_compare = college_ugds == college_ugds
>>> college_self_compare.head()

(3)乍一看,所有值都与你期望的相同。但是,使用 .all方法确定每列是否仅包含True值,则会产生意外的结果。

>>> college_self_compare.all() 
UGDS_WHITE False
UGDS_BLACK False
UGDS_HISP False
UGDS_ASIAN False
UGDS_AIAN False
UGDS_NHPI False
UGDS_2MOR False
UGDS_NRA False
UGDS_UNKN False 
dtype: bool

(4)发生这种情况是因为缺失值之间彼此进行比较时,它们是不相等的。如果你尝试使用equals运算符对缺失值进行计数并对布尔值列求和,则每列的计数总和都将得到0。

>>> (college_ugds == np.nan).sum() 
UGDS_WHITE 0
UGDS_BLACK 0
UGDS_HISP 0
UGDS_ASIAN 0
UGDS_AIAN 0
UGDS_NHPI 0
UGDS_2MOR 0
UGDS_NRA 0
UGDS_UNKN 0
dtype: int64

(5)另外,如果使用.isna方法代替equals运算符查找缺失值,则结果将完全不同。

>>> college_ugds.isna().sum()
UGDS_WHITE 661
UGDS_BLACK 661
UGDS_HISP 661
UGDS_ASIAN 661
UGDS_AIAN 661
UGDS_NHPI 661
UGDS_2MOR 661
UGDS_NRA 661
UGDS_UNKN 661
dtype: int64 

(6)比较两个完整的DataFrame的正确方法是使用.equals方法,而非使用equals运算符。.equals方法可以将相同位置的NaN视为相等。

>>> college_ugds.equals(college_ugds) 
True

值得一提的是,.eq方法等效于equals运算符。

原理解释

步骤(1)将一个DataFrame与一个标量值进行了比较,而步骤(2)则将一个DataFrame与另一个DataFrame进行了比较。乍看之下,这两种操作都非常简单直观。步骤(2)的操作是检查DataFrame是否具有相同标签的索引,从而具有相同数量的元素;如果不是这种情况,则操作将失败。步骤(3)验证了DataFrame中的列均不相等。步骤(4)进一步显示了np.nan及其自身的不相等性。步骤(5)验证了DataFrame中确实存在缺失值。最后,步骤(6)显示了使用 .equals方法比较DataFrame的正确方法,该方法将始终返回一个布尔标量值。

扩展知识

所有比较运算符都有对应的方法,可以使用更多功能。容易令人搞混的是,DataFrame的 .eq 方法可以进行逐元素的比较,就像equals运算符一样。因此,.eq方法与 .equals方法是完全不同的。以下代码重复了步骤(1)。

>>> college_ugds.eq(0.0019) # same as college_ugds == .0019

在pandas.testing子程序包中,在创建单元测试时,存在一个分析人员可以使用的函数。如果两个DataFrame不相等,则assert_frame_equal函数将引发AssertionError;如果两个DataFrame相等,则返回None。

>>> from pandas.testing import assert_frame_equal
>>> assert_frame_equal(college_ugds, college_ugds) is None 
True

单元测试是软件开发中非常重要的部分,它将确保代码正确运行。Pandas包含成千上万的单元测试,有助于确保其正常运行。要了解有关Pandas运行其单元测试的更多信息,可参考以下说明文档。

http://bit.ly/2vmCSU6

转置DataFrame操作的方向

许多DataFrame方法都有一个axis参数,此参数可控制操作发生的方向。此外,axis参数可以是 'index'(或0)或 'columns'(或1)。笔者更喜欢使用字符串值,因为这些字符串值更明确,并且使代码更易于阅读。几乎所有DataFrame方法都将axis参数默认为0,该参数适用于沿着索引的操作。此秘笈将展示如何沿着两个轴调用相同的方法。

实战操作

(1)读取college数据集。以UGDS开头的列代表特定种族的本科生百分比。使用过滤器(filter)方法选择以下列。

>>> college = pd.read_csv(
...  "data/college.csv", index_col="INSTNM"
... )
>>> college_ugds = college.filter(like="UGDS_")
>>> college_ugds.head()

(2)现在,DataFrame包含同类型的列数据,因此可以在垂直和水平方向上合理地进行操作。.count方法可以返回非缺失值的数量。默认情况下,其axis参数被设置为0。

>>> college_ugds.count()
UGDS_WHITE 6874
UGDS_BLACK 6874
UGDS_HISP 6874
UGDS_ASIAN 6874
UGDS_AIAN 6874
UGDS_NHPI 6874
UGDS_2MOR 6874
UGDS_NRA 6874
UGDS_UNKN 6874
dtype: int64 

axis参数总是被设置为0。因此,步骤(2)等效于college_ugds.count(axis=0) 和college_ugds.count(axis='index')。(3)将axis参数更改为 'columns' 会改变操作的方向,这样就可以获取每行中非缺失值的计数。

>>> college_ugds.count(axis="columns").head() 
INSTNM
Alabama A & M University    9
University of Alabama at Birmingham 9
Amridge University      9
University of Alabama in Huntsville 9
Alabama State University    9
dtype: int64

(4)我们可以对每行中的所有值求和,而不是计算非缺失值。每行的百分比数加起来应该为1。.sum方法可用于验证这一点。

>>> college_ugds.sum(axis="columns").head() 
INSTNM
Alabama A & M University    1.0000
University of Alabama at Birmingham 0.9999 
Amridge University      1.0000
University of Alabama in Huntsville 1.0000
Alabama State University    1.0000
dtype: float64

(5)要了解每一列的分布,可以使用.median方法。

>>> college_ugds.median(axis="index")
UGDS_WHITE 0.55570
UGDS_BLACK 0.10005
UGDS_HISP 0.07140
UGDS_ASIAN 0.01290
UGDS_AIAN 0.00260
UGDS_NHPI 0.00000
UGDS_2MOR 0.01750
UGDS_NRA 0.00000
UGDS_UNKN 0.01430
dtype: float64

原理解释

轴上的操作方向是Pandas比较混乱的方面之一。许多Pandas用户很难记住axis参数的含义。这里,笔者通过提醒自己,一个Series只有一个轴,这个轴就是索引(或0),以此记住axis参数的含义。DataFrame除了有索引(轴0)外,还有列(轴1)。2.9.3  扩展知识 在使用.cumsum方法时,设置axis=1参数可以跨越每行累计(accumulate)本科生的种族百分比。.cumsum方法给出的数据视图略有不同。例如,.cumsum方法很容易看到每所学校的白人和黑人学生的确切百分比。

>>> college_ugds_cumsum = college_ugds.cumsum(axis=1)
>>> college_ugds_cumsum.head()

推荐书单

《Pandas1.x实例精解》

本书详细阐述了与Pandas相关的基本解决方案,主要包括Pandas基础,DataFrame基本操作,创建和保留DataFrame,开始数据分析,探索性数据分析,选择数据子集,过滤行,对齐索引,分组以进行聚合、过滤和转换,将数据重组为规整形式,组合Pandas对象,时间序列分析,使用Matplotlib、Pandas和Seaborn进行可视化,调试和测试等内容。此外,本书还提供了相应的示例、代码,以帮助读者进一步理解相关方案的实现过程。本书适合作为高等院校计算机及相关专业的教材和教学参考书,也可作为相关开发人员的自学用书和参考手册。

购买链接:https://u.jd.com/9IOYicg

精彩回顾

Pandas如何使用DataFrame方法链

Pandas如何对DataFrame排序和统计

利用Pandas操作DataFrame的列与行

《Pandas1.x实例精解》新书抢先看!

微信搜索关注《Python学研大本营》

访问【IT今日热榜】,发现每日技术热点

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值