目录
介绍
清理按键
查找不一致的数据
总结
确保整个DataFrame一致是很重要的。这包括确保数据的类型正确,消除不一致之处并标准化值。
- 下载CSV和数据库文件-127.8 KB
- 下载源代码122.4 KB
本文是使用Python和Pandas进行数据清洗系列的一部分。它旨在利用数据科学工具和技术来使开发人员快速启动并运行。
如果您想查看本系列的其他文章,可以在这里找到它们:
- 第1部分-介绍Jupyter和Pandas
- 第2部分-将CSV和SQL数据加载到Pandas中
- 第3部分-纠正Pandas中的缺失数据
- 第4部分-合并Pandas中的多个数据集
- 第5部分-清理Pandas DataFrame中的数据
- 第6部分-重塑Pandas DataFrame中的数据
- 第7部分-使用Seaborn和Pandas进行数据可视化
现在,我们有了一个包含所有组合的客户,产品和购买数据的大数据框架,我们将在整形之前最后一遍清理数据集。
请注意,我们已经创建了完整的Jupyter Notebook,其中包含该系列模块的源数据文件,您可以在本文头部下载和安装。
我们当前的数据集不包含任何缺少的值,但仍可能包含没有意义或不是正确数据类型的值。让我们看一下查找和清除此类数据的一些方法。
清理按键通过将我们的DataFrame与三组数据结合在一起,我们在数据集本身周围存在一些不一致之处。要解决此问题,让我们删除一些重复的键,然后重命名一些其他键。
首先,让我们开始一个新的代码块,并使用以下命令删除重复的标识符:
combinedData.drop(columns='customer_num', inplace=True)
combinedData.drop(columns='product_num', inplace=True)
这将删除customer_num和product_num列。
Pandas还可以重命名列,因此让我们将三个“id”列重命名为更具代表性的名称:
combinedData = combinedData.rename(columns={'id_x':'purchase_id', 'id_y':'customer_id','id':'product_id'})
这会将列ID重命名为其相应的源,并清理了我们的表。
数据不匹配的另一个重要原因是查找其中包含与键的意图不一致的数据的字段。例如,您可能将字符串值与数字混合在一起。让我们检查数据集,看看是否存在任何相关问题。
创建一个新的代码块,并使用一开始就看到的命令:
print(combinedData.dtypes)
print(combinedData.head(2))
结果如下:
正如您从结果中看到的那样,许多数据通常被归类为对象,只有少数键被归类为数字(int64)。
让我们尝试将purch_date密钥转换为日期时间,看看是否发生任何问题。
- to_datetime方法尝试将值转换为日期时间类型
- to_to_numeric方法尝试将值转换为数字类型
- value_counts方法计算不同值的数量
- str.replace方法适用于替换字符串中的字符
将上面的代码块更改为以下内容:
print(pd.to_datetime(combinedData['purch_date'], errors='coerce').isnull().value_counts())
现在,此代码块尝试转换purch_date列中的所有值,并计算发生了多少错误(True)或成功(False)。幸运的是,这次我们没有错误(第一个和第二个数字匹配)。
让我们扩展此代码块以同时检查数字和货币键:
print(pd.to_numeric(combinedData['amount'], errors='coerce').isnull().value_counts())
print(pd.to_numeric(combinedData['paid'], errors='coerce').isnull().value_counts())
print(pd.to_numeric(combinedData['cost'], errors='coerce').isnull().value_counts())
结果如下:
如果我们现在看看这些数字,在所有的paid和cost错误中,都有两个amount值也是错误的。cost与paid列应该是很简单的修复,因大Pandas不能处理与美元符号($)编写的货币值。我们将通过以下两种方法在检查之前从两个amount键中删除所有美元符号来解决此问题:
combinedData.paid = combinedData['paid'].str.replace('$','')
combinedData.cost = combinedData['cost'].str.replace('$','')
结果如下:
当我们运行此清理然后进行检查时,cost错误已得到修复,但是paid键仍然存在大量错误。
让我们通过更改测试以引发错误来找出导致错误的值。我们将使用以下方法进行操作:
print(pd.to_numeric(combinedData['paid'], errors='raise'))
结果如下:
看起来我们的值还包含一个千位标记的逗号分隔符,因此我们也将其删除:
combinedData.paid = combinedData['paid'].str.replace(',','')
combinedData.cost = combinedData['cost'].str.replace(',','')
那很简单:
现在,当我们运行此清理阶段时,只剩下两个错误。
让我们更改amount以引发错误并查看问题所在。
看起来字符串已滑入两行。因为这是一个很小的数字,所以我们将所有键转换为正确的类型,并删除所有具有空值(应该为两个)的行。
让我们修改代码,以得到下面的最终结果:
combinedData.paid = combinedData['paid'].str.replace('$','')
combinedData.cost = combinedData['cost'].str.replace('$','')
combinedData.paid = combinedData['paid'].str.replace(',','')
combinedData.cost = combinedData['cost'].str.replace(',','')
combinedData.purch_date = pd.to_datetime(combinedData['purch_date'], errors='coerce')
combinedData.amount = pd.to_numeric(combinedData['amount'], errors='coerce')
combinedData.paid = pd.to_numeric(combinedData['paid'], errors='coerce')
combinedData.cost = pd.to_numeric(combinedData['cost'], errors='coerce')
combinedData.dropna(subset = ['amount'], inplace=True)
print(combinedData.isnull().sum())
print(combinedData.shape)
print(combinedData.dtypes)
结果如下:
现在,我们得到了最终结果:带有正确分配的类型的5,067行清除数据。
总结我们对数据集进行了最后的迭代,并从值中清除了其余的不一致之处。我们还确保数据集已正确分配了值类型,并形成了完整的图片。
接下来,我们将看到如何重塑数据以使其准备好可视化。