作者 | June Tao Ching 编译 | VK 来源 | Towards Data Science
数据清理是任何项目中最关键的一步,如果处理不当,可能会得出完全不同的结论。通常,在大多数项目中,我们可能会花费一半的时间来清理数据。
在本文中,我将分享一些Python函数,它们可以帮助我们进行数据清理,特别是在以下方面:
入门
我们将在这个项目中使用pandas,让我们安装包。
conda install pandas
我已经修改了著名的泰坦尼克号数据集从Kaggle演示的目的,你可以在这里下载数据集:https://github.com/chingjunetao/medium-article/blob/master/simple-guide-to-data-cleaning/modified_titanic_data.csv
让我们导入包并读取数据集。
import pandas as pd
df = pd.read_csv("modified_titanic_data.csv")
df.head()
df.head()将显示数据帧的前5行,使用此函数可以快速浏览数据集。
删除未使用的列
根据我们的样本,有一个无效/空的Unnamed:13列我们不需要。我们可以使用下面的函数删除它。
# df = df.drop(columns="Unnamed: 13")
# or
df.drop(columns="Unnamed: 13", inplace = True)
df.head()
如果要删除多个列,则需要一个数组来传入columns参数。
inplace=True将直接对数据帧本身执行操作,默认情况下,它将创建另一个副本,你必须再次将其分配给数据帧,如df = df.drop(columns="Unnamed: 13")。
删除重复项
让我们使用此函数检查此数据集中的重复项。
df[df.duplicated(keep=False)]
keep允许一些参数检查重复项。
在本例中,我希望显示所有的重复项,因此传递False作为参数。现在我们已经看到这个数据集中存在重复项,我想删除它们并保留第一个出现项。下面的函数用于保留第一个引用。
df = df.drop_duplicates(keep="first")
我们可以使用len(df)或df[df.duplicated(keep=False)]检查是否删除了重复项。如果删除了重复项,df[df.duplicated(keep=False)]将返回null。
数据映射
# 在列gender中显示可用值
df["Sex"].unique()
df["Sex"].hist()
df["Sex"] = df["Sex"].map({
"male": "male",
"m": "male",
"m ": "male",
"M": "male",
"F": "female",
"f": "female",
"female": "female"
})
df["Sex"].unique()
在df["Sex"].unique和df["Sex"].hist()的帮助下,我们发现此列中还存在其他值,如m,M,f和F。这可能是由于来自数据源的错误输入造成的,我们必须假设这些值是正确的,并映射到男性或女性。
df["Sex"] = df["Sex"].map({
"male": "male",
"m": "male",
"m ": "male",
"M": "male",
"F": "female",
"f": "female",
"female": "female"
})
上面的函数用于将这些值映射到男性或女性。
注意:请确保映射中包含默认值male和female,否则在执行映射后它将变为nan。
处理空数据
此列中缺少3个值:-、na和NaN。pandas不承认-和na为空。在处理它们之前,我们必须用null替换它们。
import numpy as np
df['Age'] = df['Age'].replace('-', np.NaN)
df['Age'] = df['Age'].replace('na', np.NaN)
df["Age"].head(10)
########################
##### Option 2 #####
missing_values = ["na", "-"]
df2 = pd.read_csv("modified_titanic_data.csv", na_values = missing_values)
df2["Age"].head(10)
replace()将-,na替换为null。
如果我们在读取数据时发现了这个问题,我们实际上可以通过将缺失值传递给na_values参数来处理这个缺失值。结果是一样的。
现在我们已经用空值替换了它们,我们将如何处理那些缺失值呢?
如果我们确信丢失的数据是无用的,或者丢失的数据只是数据的一小部分,那么我们可以删除包含丢失值的行。
在统计学中,这种方法称为删除,它是一种处理缺失数据的方法。在该方法中,如果缺少任何单个值,则整个记录将从分析中排除。
如果我们确信这个特征(列)不能提供有用的信息或者缺少值的百分比很高,我们可以删除整个列。这在进行统计分析时非常有用,因为填充缺失值可能会产生意外或有偏差的结果。
它意味着根据其他数据计算缺失值。例如,我们可以计算年龄和出生日期的缺失值。
在这种情况下,我们没有出生日期,我们可以用数据的平均值或中位数替换缺失值。
注:平均值在数据不倾斜时最有用,而中位数更稳健,对异常值不敏感,因此在数据倾斜时使用。
在这种情况下,让我们使用中位数来替换缺少的值。
df["Age"].median用于计算数据的中位数,而fillna用于中位数替换缺失值。
现在你已经学会了如何用pandas清理Python中的数据。我希望这篇文章对你有用。如果我有任何错误或打字错误,请给我留言。
你可以在我的Github中查看完整的Jupyter笔记本:https://github.com/chingjunetao/medium-article/blob/master/simple-guide-to-data-cleaning/data-cleaning.ipynb