如何用 Python 清洗数据?( 二 )


如何用 Python 清洗数据?

文章插图
 
如果想要保留重复的最后一行 , 那么需要指定 keep 参数 。
# 按某一列排除重复 , 并保留最后一行df.drop_duplicates(['花色'], keep='last')
如何用 Python 清洗数据?

文章插图
 
从上面两个返回结果的编号可以看出 , 不同方法的差异情况 。
3. 如何删除缺失?
使用 dropna() 函数 , 默认删除包含缺失的行 。为了更加简单易懂 , 我们用扑克牌中不重复的花色作为示例 。
# 不重复的花色color = df.drop_duplicates(['花色'])color
如何用 Python 清洗数据?

文章插图
 
# 删除包含缺失值的行color.dropna()
如何用 Python 清洗数据?

文章插图
 
如果想要删除整行全部为空的行 , 那么需要指定 how 参数 。
# 删除全部为空的行color.dropna(how='all')
如何用 Python 清洗数据?

文章插图
 
如果想要删除包含缺失值的列 , 那么需要指定 axis 参数 。
# 删除包含缺失值的列color.dropna(axis=1)
如何用 Python 清洗数据?

文章插图
 
可以看到 , 包含缺失值的「花色」这一列被删除了 。
4. 如何补全缺失?
使用 fillna() 函数 , 可以将缺失值填充为我们指定的值 。
# 补全缺失值color.fillna('Joker')
如何用 Python 清洗数据?

文章插图
 
可以看到 , 原来的 NaN 被填充为 Joker , 在实际工作的应用中 , 通常填充为 0 , 也就是说 ,  fillna(0) 是比较常见的用法 。
如果想要使用临近的值来填充 , 那么需要指定 method 参数 , 例如:
# 用后面的值填充color.fillna(method='bfill')
如何用 Python 清洗数据?

文章插图
 
可以看到 , 原来第一行的 NaN 替换成了第二行的「黑桃:spades:」 。
其中 method 还有一些其他的可选参数 , 详情可以查看相关的帮助文档 。
还有一种按字典填充的方法 。为了让下面的演示更加直观易懂 , 我们先把索引为 2 的牌面设置为缺失值:
# 为了演示 , 先指定一个缺失值color.loc[2, '牌面'] = np.nancolor
如何用 Python 清洗数据?

文章插图
 
# 按列自定义补全缺失值color.fillna({'花色': 0, '牌面': 1})
如何用 Python 清洗数据?

文章插图
 
可以看出 , 不同列的缺失值 , 可以填充为不同的值 , 花色这一列填充为 0 , 牌面这一列填充为 1 , 我在图中分别用红色的方框标记出来了 。
5. 应用案例
下面 我们用 Python 代码 , 把这幅待清洗的扑克牌数据集 , 变成一副正常的扑克牌数据 。
import numpy as npimport pandas as pd# 设置最多显示 10 行pd.set_option('max_rows', 10)# 从 Excel 文件中读取原始数据df = pd.read_excel('待清洗的扑克牌数据集.xlsx')# 补全缺失值df = df.fillna('Joker')# 排除重复值df = df.drop_duplicates()# 修改异常值df.loc[4, '牌面'] = 3# 增加一张缺少的牌df = df.Append({'编号': 4,'花色': '黑桃♠','牌面': 2},ignore_index=True)# 按编号排序df = df.sort_values('编号')# 重置索引df = df.reset_index()# 删除多余的列df = df.drop(['index'], axis=1)# 把清洗好的数据保存到 Excel 文件df.to_excel('完成清洗的扑克牌数据.xlsx',index=False)df返回结果如下:
可以看到 , 我们已经成功地把它变成了一副正常的扑克牌数据 。
6. 小结
我们简单回顾一下本文的主要内容 , 首先 , 我们从宏观层面介绍了数据分析的 8 个步骤 , 然后用一副待清洗的扑克牌数据集作为示例 , 从读取数据 , 到查找异常 , 再到排除重复、删除缺失和补全缺失 , 最后 , 我们用一个案例 ,  完整 演示了清洗数据的过程 。


推荐阅读