利用 Python 的 Pandas和 NumPy 库来清理数据


Posted in Python onApril 13, 2022

许多数据科学家认为获取和清理数据的初始步骤占工作的 80%,花费大量时间来清理数据集并将它们归结为可以使用的形式。

因此如果你是刚刚踏入这个领域或计划踏入这个领域,重要的是能够处理杂乱的数据,无论数据是否包含缺失值、不一致的格式、格式错误的记录还是无意义的异常值。

将利用 Python 的 Pandas和 NumPy 库来清理数据。

准备工作

导入模块后就开始正式的数据预处理吧。

import pandas as pd
import numpy as np

DataFrame 列的删除

通常会发现并非数据集中的所有数据类别都有用。例如可能有一个包含学生信息(姓名、年级、标准、父母姓名和地址)的数据集,但希望专注于分析学生成绩。在这种情况下地址或父母的姓名并不重要。保留这些不需要的数据将占用不必要的空间。

BL-Flickr-Images-Book.csv 数据操作。

df = pd.read_csv('数据科学必备Pandas、NumPy进行数据清洗/BL-Flickr-Images-Book.csv')
df.head()

利用 Python 的 Pandas和 NumPy 库来清理数据

可以看到这些列是对 Edition Statement, Corporate Author, Corporate Contributors, Former owner, Engraver, Issuance type and Shelfmarks 没有任何信息帮助的,因此可以进行批量删除处理。

to_drop_column = [ 'Edition Statement',
                   'Corporate Author',
                   'Corporate Contributors',
                   'Former owner',
                   'Engraver',
                   'Contributors',
                   'Issuance type',
                   'Shelfmarks']

df.drop(to_drop_column , inplace=True, axis=1)
df.head()

利用 Python 的 Pandas和 NumPy 库来清理数据

DataFrame 索引更改

Pandas 索引扩展了 NumPy 数组的功能,以允许更通用的切片和标记。 在许多情况下,使用数据的唯一值标识字段作为其索引是有帮助的。

获取唯一标识符。

df['Identifier'].is_unique
True

Identifier列替换索引列。

df = df.set_index('Identifier')
df.head()

利用 Python 的 Pandas和 NumPy 库来清理数据

206 是索引的第一个标签,可以使用 df.iloc[0] 基于位置的索引访问。

DataFrame 数据字段整理

清理特定列并将它们转换为统一格式,以更好地理解数据集并强制保持一致性。

处理 Date of Publication 出版日期 列,发现该数据列格式并不统一。

df.loc[1905:, 'Date of Publication'].head(10)

Identifier
1905           1888
1929    1839, 38-54
2836           1897
2854           1865
2956        1860-63
2957           1873
3017           1866
3131           1899
4598           1814
4884           1820
Name: Date of Publication, dtype: object

我们可以使用正则表达式的方式直接提取连续的4个数字即可。

extr = df['Date of Publication'].str.extract(r'^(\d{4})', expand=False)
extr.head()

Identifier
206    1879
216    1868
218    1869
472    1851
480    1857
Name: Date of Publication, dtype: object

最后获取数字字段列。

df['Date of Publication'] = pd.to_numeric(extr)

str 方法与 NumPy 结合清理列

df[‘Date of Publication’].str 。 此属性是一种在 Pandas 中访问快速字符串操作的方法,这些操作在很大程度上模仿了对原生 Python 字符串或编译的正则表达式的操作,例如 .split()、.replace() 和 .capitalize()。

要清理 Place of Publication 字段,我们可以将 Pandas 的 str 方法与 NumPy 的 np.where 函数结合起来,该函数基本上是 Excel 的 IF() 宏的矢量化形式。

np.where(condition, then, else)

在这里 condition 要么是一个类似数组的对象,要么是一个布尔掩码。 then 是如果条件评估为 True 时使用的值,否则是要使用的值。

本质上 .where() 获取用于条件的对象中的每个元素,检查该特定元素在条件上下文中的计算结果是否为 True,并返回一个包含 then 或 else 的 ndarray,具体取决于哪个适用。可以嵌套在复合 if-then 语句中,允许根据多个条件计算值.

处理 Place of Publication 出版地 数据。

df['Place of Publication'].head(10)

Identifier
206                                  London
216                London; Virtue & Yorston
218                                  London
472                                  London
480                                  London
481                                  London
519                                  London
667     pp. 40. G. Bryan & Co: Oxford, 1898
874                                 London]
1143                                 London
Name: Place of Publication, dtype: object

使用包含的方式提取需要的数据信息。

pub = df['Place of Publication']
london = pub.str.contains('London')
london[:5]

Identifier
206    True
216    True
218    True
472    True
480    True
Name: Place of Publication, dtype: bool

也可以使用 np.where 处理。

df['Place of Publication'] = np.where(london, 'London',
                                      pub.str.replace('-', ' ')))

Identifier
206                     London
216                     London
218                     London
472                     London
480                     London
                  ...         
4158088                 London
4158128                  Derby
4159563                 London
4159587    Newcastle upon Tyne
4160339                 London
Name: Place of Publication, Length: 8287, dtype: object

apply 函数清理整个数据集

在某些情况下,将自定义函数应用于 DataFrame 的每个单元格或元素。 Pandas.apply() 方法类似于内置的 map() 函数,只是将函数应用于 DataFrame 中的所有元素。

例如将数据的发布日期进行处理成 xxxx 年的格式,就可以使用apply。

def clean_date(text):
    try:
        return str(int(text)) + "年"
    except:
        return text

df["new_date"] = df["Date of Publication"].apply(clean_date)
df["new_date"] 

Identifier
206        1879年
216        1868年
218        1869年
472        1851年
480        1857年
           ...  
4158088    1838年
4158128    1831年
4159563      NaN
4159587    1834年
4160339    1834年
Name: new_date, Length: 8287, dtype: object

DataFrame 跳过行

olympics_df = pd.read_csv('数据科学必备Pandas、NumPy进行数据清洗/olympics.csv')
olympics_df.head()

利用 Python 的 Pandas和 NumPy 库来清理数据

可以在读取数据时候添加参数跳过某些不要的行,比如索引 0 行。

olympics_df = pd.read_csv('数据科学必备Pandas、NumPy进行数据清洗/olympics.csv',header=1)
olympics_df.head()

利用 Python 的 Pandas和 NumPy 库来清理数据

DataFrame 重命名列

new_names =  {'Unnamed: 0': 'Country',
              '? Summer': 'Summer Olympics',
               '01 !': 'Gold',
              '02 !': 'Silver',
              '03 !': 'Bronze',
              '? Winter': 'Winter Olympics',
              '01 !.1': 'Gold.1',
              '02 !.1': 'Silver.1',
              '03 !.1': 'Bronze.1',
              '? Games': '# Games',
              '01 !.2': 'Gold.2',
              '02 !.2': 'Silver.2',
              '03 !.2': 'Bronze.2'}

olympics_df.rename(columns=new_names, inplace=True)

olympics_df.head()

利用 Python 的 Pandas和 NumPy 库来清理数据

以上就是详解Python如何利用Pandas与NumPy进行数据清洗的详细内容!

Python 相关文章推荐
跟老齐学Python之用Python计算
Sep 12 Python
python实现将元祖转换成数组的方法
May 04 Python
Python批量修改文本文件内容的方法
Apr 29 Python
pycharm安装和首次使用教程
Aug 27 Python
python正则表达式匹配[]中间为任意字符的实例
Dec 25 Python
Python类的继承、多态及获取对象信息操作详解
Feb 28 Python
django 单表操作实例详解
Jul 30 Python
简单分析python的类变量、实例变量
Aug 23 Python
Python 、Pycharm、Anaconda三者的区别与联系、安装过程及注意事项
Oct 11 Python
python实现自动化报表功能(Oracle/plsql/Excel/多线程)
Dec 02 Python
python 用struct模块解决黏包问题
Nov 07 Python
解决pycharm不能自动保存在远程linux中的问题
Feb 06 Python
Python matplotlib多个子图绘制整合
Python之matplotlib绘制折线图
Python之matplotlib绘制饼图
Python线程池与GIL全局锁实现抽奖小案例
Python之Matplotlib绘制热力图和面积图
Python matplotlib绘制雷达图
Python万能模板案例之matplotlib绘制甘特图
You might like
Discuz! 5.0.0论坛程序中加入一段js代码,让会员点击下载附件前自动弹出提示窗口
2007/04/18 PHP
PHP Ajax中文乱码问题解决方法
2009/02/27 PHP
PHP中foreach循环中使用引用要注意的地方
2011/01/02 PHP
关于PHP二进制流 逐bit的低位在前算法(详解)
2013/06/13 PHP
VPS中使用LNMP安装WordPress教程
2014/12/28 PHP
php获取发送给用户的header信息的方法
2015/03/16 PHP
php实现分页功能的详细实例方法
2019/09/29 PHP
jquery 图片上传按比例预览插件集合
2011/05/28 Javascript
《JavaScript高级程序设计》阅读笔记(三) ECMAScript中的引用类型
2012/02/27 Javascript
使用node.js 制作网站前台后台
2014/11/13 Javascript
使用jQuery仿苹果官网焦点图特效
2014/12/23 Javascript
深入JavaScript高级程序设计之对象、数组(栈方法,队列方法,重排序方法,迭代方法)
2015/12/01 Javascript
老生常谈JavaScript 函数表达式
2016/09/01 Javascript
BootStrap3使用错误记录及解决办法
2016/12/22 Javascript
JavaScript实现隐藏省略文字效果的方法
2017/04/27 Javascript
JavaScript数组基于交换的排序示例【冒泡排序】
2018/07/21 Javascript
js构造函数constructor和原型prototype原理与用法实例分析
2020/03/02 Javascript
jQuery实现简单QQ聊天框
2020/08/27 jQuery
Python实现向QQ群成员自动发邮件的方法
2014/11/19 Python
python中将一个全部为int的list 转化为str的list方法
2018/04/09 Python
对命令行模式与python交互模式介绍
2018/05/12 Python
python迭代dict的key和value的方法
2018/07/06 Python
解决python中使用PYQT时中文乱码问题
2019/06/17 Python
Python爬虫动态ip代理防止被封的方法
2019/07/07 Python
css3背景_动力节点Java学院整理
2017/07/11 HTML / CSS
使用CSS3来实现滚动视差效果的教程
2015/08/24 HTML / CSS
详解rem 适配布局
2018/10/31 HTML / CSS
加拿大在线隐形眼镜专家:PerfectLens.ca
2016/11/19 全球购物
美国电子产品折扣网站:Daily Steals
2017/05/20 全球购物
英国床和浴室商场:Bed & Bath Emporium
2018/05/20 全球购物
外包公司软件测试工程师
2014/11/01 面试题
Static Nested Class 和 Inner Class的不同
2013/11/28 面试题
医院学雷锋活动策划方案
2014/02/15 职场文书
公司档案管理制度
2015/08/05 职场文书
苹果电脑mac os中货币符号快捷输入
2022/02/17 杂记
Golang MatrixOne使用介绍和汇编语法
2022/04/19 Golang