对数据处理的另一类重要操作则是过滤、清理以及其他的转换工作。
移除重复数据
DataFrame中出现重复行有多种原因。下面就是一个例子:
DataFrame的duplicated方法返回一个布尔型Series,表示各行是否是重复行(前面出现过的行):
还有一个与此相关的drop_duplicates方法,它会返回一个DataFrame,重复的数组会标为False:
这两个方法默认会判断全部列,你也可以指定部分列进行重复项判断。假设我们还有一列值,且只希望根据k1列过滤重复项:
duplicated和drop_duplicates默认保留的是第一个出现的值组合。传入keep='last’则保留最后一个:
利用函数映射进行数据转换
对于许多数据集,你可能希望根据数组、Series或DataFrame列中的值来实现转换工作。我们来看看下面这组有关肉类的数据:
假设你想要添加一列表示该肉类食物来源的动物类型。我们先编写一个不同肉类到动物的映射:
Series的map方法可以接受一个函数或含有映射关系的字典型对象,但是这里有一个小问题,即有些肉类的首字母大写了,而另一些则没有。因此,我们还需要使用Series的str.lower方法,将各个值转换为小写:
当然这些可以通过一行函数解决所有问题:
使用map是一种实现元素级转换以及其他数据清理工作的便捷方式。
替换值
利用fillna方法填充缺失数据可以看做值替换的一种特殊情况。前面已经看到,map可用于修改对象的数据子集,而replace则提供了一种实现该功能的更简单、更灵活的方式。我们来看看下面这个Series:
-999这个值可能是一个表示缺失数据的标记值。要将其替换为pandas能够理解的NA值,我们可以利用replace来产生一个新的Series(除非传入inplace=True):
如果你希望一次性替换多个值,可以传入一个由待替换值组成的列表以及一个替换值:
要让每个值有不同的替换值,可以传递一个替换列表:
传入的参数也可以是字典:
重命名轴索引
跟Series中的值一样,轴标签也可以通过函数或映射进行转换,从而得到一个新的不同标签的对象。轴还可以被就地修改,而无需新建一个数据结构。接下来看看下面这个简单的例子:
跟Series一样,轴索引也有一个map方法:
你可以将其赋值给index,这样就可以对DataFrame进行就地修改:
如果想要创建数据集的转换版(而不是修改原始数据),比较实用的方法是rename:
特别说明一下,rename可以结合字典型对象实现对部分轴标签的更新:
rename可以实现复制DataFrame并对其索引和列标签进行赋值。如果希望就地修改某个数据集,传入inplace=True即可:
离散化和分箱
我们日常生活中经常会有遇见过连续的一系列的值,这些值通常需要被离散化,这样可以更加快速的实现功能,或者分离成一个个“箱子”进行逐个分析。假设你要研究一组人群中的数据,你想把它们进行分组,放入适合的年龄区间中:
之后让我们把这些年龄划分为18-25、26-35、36-60以及61以上的组。为了实现这个任务,你可以使用pandas的cut的函数:
pandas返回的是一个特殊的Categorical对象。结果展示了pandas.cut划分的面元。你可以将其看做一组表示面元名称的字符串。它的底层含有一个表示不同分类名称的类型数组,以及一个codes属性中的年龄数据的标签:
pd.value_counts(cats)是pandas.cut结果的分箱数量计数。
跟“区间”的数学符号一样,圆括号表示开端,而方括号则表示闭端(包括)。哪边是闭端可以通过right=False进行修改:
你可 以通过传递一个列表或数组到labels,设置自己的分组名称:
如果向cut传入的是面元的数量而不是确切的面元边界,则它会根据数据的最小值和最大值计算等长面元。下面这个例子中,我们将一些均匀分布的数据分成四组:
选项precision=2,限定小数只有两位。
qcut是一个非常类似于cut的函数,它可以根据样本分位数对数据进行面元划分。根据数据的分布情况,cut可能无法使各个面元中含有相同数量的数据点。而qcut由于使用的是样本分位数,因此可以得到大小基本相等的面元:
与cut类似,你也可以传递自定义的分位数(0到1之间的数值,包含端点):
检测和过滤异常值
过滤和转换异常值在很大程度上是应用数组操作的事情。考虑到一个具有正态分布数据的DataFrame:
假设你想要找到一列中绝对值大于三的:
如果条件变化,选出所有值大于3或者小于-3的行,你可以使用any方法:
所获得的值可以根据这些标准设定,下面代码限制了-3到3之间的数值:
这个np.sign(data)根据数据中值的正负分别生成1和-1填充:
计算指标/虚拟变量
将分类变量转换为“虚拟”或“指标”矩阵是一种用于统计建模或机器学习的转换操作。如果DataFrame中的一列有k个不同的值,则可以衍生一个k列的值为1或0的矩阵或者DataFrame。pandas有一个get_dummies函数用于实现该功能:
在某些情况下,你可能想在指标DataFrame的列上加入前缀,然后与其他数据合并起来。在get_dummies方法中有一个前缀参数用于实现这样的功能:
如果DataFrame中的一行属于多个类别,则情况会更加复杂。我们先看一个数据集MovieLens的1M数据集:
要为每个电影流派添加指标变量需要一些数据处理。首先我们从数据集中提出所有的流派列表:
构建指标DataFrame的方法之一是从一个全零DataFrame开始:
现在,迭代每一部电影,并将dummies各行的条目设为1。要这么做,我们使用dummies.columns来计算每个类型的列索引:
然后,根据索引,使用.iloc设定值:
然后,和以前一样,再将其与movies合并起来:
一个对统计应用有用的秘诀是:结合get_dummies和诸如cut之类的离散化函数:
我们用numpy.random.seed,使这个例子具有确定性。
到此这篇python argparse模块详解(python中arch模块)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/pythonbc/16463.html