微信公众号:python均值数据科学
数据科学家花了大量的时间清洗数据集并将这些数据转换为他们可以处理的格式。事实上很多数据科学家声称开始获取和清洗数据的工作量要占整个工作的80%。
因此如果你正巧也在这个领域中,或者计划进入这个领域那么处理这些杂乱不规则数据是非常重要的,这些杂乱數据包括一些缺失值不连续格式,错误记录或者是没有意义的异常值。
在这个教程中我们将利用python均值的Pandas
和Numpy
包来进行数据清洗。
在这┅点上Place of Publication
就是一个很好的需要被转换成分类数据的类型,因为我们可以用整数将这相当小的唯一城市集编码(分类数据的使用内存与分類的数量以及数据的长度成正比)
applymap
方法清洗整个数据集
在一定的情况下,你将看到并不是仅仅有一条列不干净而是更多的。
在一些實例中使用一个定制的函数到DataFrame的每一个元素将会是很有帮助的。pandas
的applyma()
方法与内建的map()
函数相似并且简单的应用到一个DataFrame
中的所有元素上。
我們可以利用这个特征创建一个含有(state,city)
元组的列表并将这个列表嵌入到DdataFrame
中,
我们可以像上面使用for loop来进行清洗但是pandas提供了更简单的办法。我們只需要state name和town name然后就可以移除所以其他的了。这里我们可以再次使用pandas的.str()
方法同时我们也可以使用applymap()
将一个python均值 callable映射到DataFrame中的每个元素上。
我們一直在使用"元素"这个摄于但是我们到底是什么意思呢?看看下面这个"toy"的DataFrame:
在这个例子中每个单元 (‘Mock’, ‘Dataset’, ‘python均值’, ‘Pandas’, etc.) 都是一个元素。因此applymap()
将分别应用一个函数到这些元素上。让我们定义这个函数
pandas的applymap()
只用一个参数,就是要应用到每个元素上的函数(callable)
首先,我們定义一个函数它将从DataFrame中获取每一个元素作为自己的参数。在这个函数中检验元素中是否有一个(
或者[
。
基于上面的检查函数返回相應的值。最后applymap()
函数被用在我们的对象上。现在DataFrame就看起来更干静了
applymap()
方法从DataFrame中提取每个元素,传递到函数中然后覆盖原来的值。就是这麼简单!
技术细节:虽然.applymap
是一个方便和灵活的方法但是对于大的数据集它将会花费很长时间运行,因为它需要将python均值 callable应用到每个元素上一些情况中,使用Cython或者NumPY的向量化的操作会更高效
经常的,你处理的数据集会有让你不太容易理解的列名或者在头几行或最后几行有┅些不重要的信息,例如术语定义或是附注。
这种情况下我们想重新命名列和移除一定的行以让我们只留下正确和有意义的信息。
为叻证明我们如何处理它我们先看一下"olympics.csv"数据集的头5行:
这的确有点乱!列名是以整数的字符串形式索引的,以0开始本应该是列名的行却處在olympics_df.iloc[0]
。发生这个是因为CSV文件以0, 1, 2, …, 15起始的
因此,我们需要做两件事:
当我们读CSV文件的时候可以通过传递一些參数到read_csv
函数来移除行和设置列名称。
这个函数有很多可选桉树但是这里我们只需要header
我们现在有了设置为header的正确行,并且所有没用的行都被移除了记录一下pandas是如何将包含国家的列名NaN
改变为Unnamed:0
的。
为了重命名列我们将使用DataFrame的rename()
方法,允许你以一个映射(这里是一个字典)重新標记一个轴
让我们开始定义一个字典来将现在的列名称(键)映射到更多的可用列名称(字典的值)。
我们在对象上调用rename()
函数:
设置inplace
为True
鈳以让我们的改变直接反映在对象上让我们看看是否正确:
这个教程中,你学会了从数据集中如何使用drop()
函数去除不必要的信息也学会了如何为数据集设置索引,以让items可以被容易的找到
更多的,你学会了如何使用.str()
清洗对象字段以及如何使用applymap
对整个數据集清洗。最后我们探索了如何移除CSV文件的行,并且使用rename()
方法重命名列
掌握数据清洗非常重要,因为它是数据科学的一个大的部分你现在应该有了一个如何使用pandas和numpy进行数据清洗的基本理解了。
关注微信公众号python均值数据科学获取 120G
人工智能 学习资料。
這將是最容易解釋從dataframe的示例開始:
所以我想查看列名值,如果它們與整數相同我希望輸出列具有每個時間索引值的平均值。
我的想法是使用 df.round 將列標題繞到最近的整數然後使用. mean() 對同一個列標題應用 for 。 但是在dataframe索引類型上使用round函數時,出現了一個錯誤
編輯:根據答案,我使用了
它會弄亂列名和值而不昰給我基於的名字。""。不知道為什麼 !