使用Pandas进行数据清理过程的简单步骤 - sahilfruitwala

21-07-19 banq

数据清理是删除、添加或修改数据以进行分析和其他机器学习任务的过程。如果需要数据清理,它总是在任何类型的分析或机器学习任务之前完成。
Clive Humby 说:“数据是新的石油。” 但我们知道数据仍然需要细化。
数据被认为是公司的主要资产之一。误导性或不准确的数据是有风险的,可能是公司倒闭的原因。可供我们使用的数据不需要每次都有用,我们必须执行许多操作才能使其有用。因此,删除不必要的数据并格式化和修改重要数据是一个好主意,以便我们可以使用它。在某些场景下,还需要通过对可用数据进行处理来对外添加信息。例如,根据一些已经存在的数据添加一个语言列,或者根据其他一些列的数据生成一个具有平均值的列。
数据清理过程涉及许多步骤。这些所有步骤都不是每个人都必须遵循或使用的。为了执行数据清理,我们将使用python编程语言和pandas库。我使用过 python 是因为它的表现力很强,而且很容易学习和理解。更重要的是,python 是许多机器学习任务专家的选择,因为没有计算机科学背景的人可以轻松学习它。除了python的好处;pandas 是一种快速、强大、灵活且易于使用的开源数据分析和操作工具,是目前最流行的数据分析和处理工具之一。在开始数据清理过程之前了解您的数据非常重要,因为执行什么清理过程完全取决于您拥有什么样的数据以及该数据的性质是什么。
  

清理数据的分步过程
在清理数据之前,正确加载数据很重要。在本教程中,我将展示从 CSV 文件加载数据的基本方法。在此处查找更多读取 CSV 的选项。

import pandas as pd

"""
Data Loading
"""

# 1. Read data from csv default way
# df = pd.read_csv('my_file.csv')

# 2. Read data from csv using comma as delimiter
# df = pd.read_csv('my_file.csv', delimiter=',')

# 3. Read data from csv using comma as delimiter and no headers
# df = pd.read_csv('my_file.csv', delimiter=',', header=None)

# 4. Read data from csv using comma as delimiter and custom headers
my_headers = ['Id','Name', 'Type', 'Price']
df = pd.read_csv('my_file.csv', delimiter=',', header=0, names=my_headers)
 

删除重复数据
在每个数据清理过程中都需要遵循某些步骤。这些步骤之一是删除重复数据。无论是文本数据还是数字数据,删除重复数据都非常重要,因为如果数据集包含太多重复数据,那么处理该数据的时间也会增加。

"""
Removing Duplicates
"""
# 1. Removes duplicate and returns a copy of dataframe 
df = df.drop_duplicates()

# 2. Removes duplicates in place
df = df.drop_duplicates(inplace=True)

# 3. Drops duplicates and keep first/last occurance
df = df.drop_duplicates(inplace=True, keep='last')

# 4. Consider only certain columns for identigying duplicates
df = df.drop_duplicates(subset=['Id', 'Price'], inplace=True, keep='last')


 

删除表情符号
在很多情况下,我们不希望在我们的文本数据集中使用表情符号。我们可以通过使用一行代码来删除表情符号。下面显示的代码片段将逐列从 Pandas 数据框中删除表情符号。代码片段可以在Stackoverflow上找到。

"""
Remove emojis
"""
df = df.astype(str).apply(lambda x: x.str.encode('ascii', 'ignore').str.decode('ascii'))

此代码片段将所有数据编码为ASCII(美国信息交换标准代码)值,如果数据无法编码,则忽略。编码后,它会尝试再次将它们全部解码,因为在编码过程中忽略了所有表情符号。所以现在我们拥有没有表情符号的所有数据。
 

将数据改成小写
很有可能改变数据案例。在这里,我附加了一个代码片段来将数据更改为小写。

"""
Convert to lowercase
"""
df['Type'] = df['Type'].str.lower()
df['Name'] = df['Name'].str.lower()

 

删除多个空格、制表符和换行符
每个数据集都包含不必要的空格、制表符和换行符。问题是我们可以清楚地看到制表符和换行符,但看不到空格,这反过来会影响我们训练模型的时间。

"""
Remove multiple whitespaces, tabs and newlines
"""
df['Type'] = df['Type'].str.replace('\n', '')
df['Type'] = df['Type'].str.replace('\t', ' ')
df['Type'] = df['Type'].str.replace(' {2,}', ' ', regex=True)
df['Type'] = df['Type'].str.strip()


前两行代码将分别用空字符替换制表符和换行符。第三行将在正则表达式(regex)的帮助下找到两个或多个空格,并将其替换为单个空格。最后,最后一行将从两边剥离(去除空格)数据。
 

删除 URL(统一资源定位器)
许多人使用调查来获取数据。人们倾向于随机填写详细信息,有时这些数据中包含 URL。我已经使用代码片段中显示的正则表达式模式来删除 URL,尽管可以使用任何正则表达式模式来匹配 URL。在这里,我用空字符串字符替换了匹配的 URL 模式。

"""
Remove URLs
"""
df['Type'] = df['Type'].replace(r'http\S+', '', regex=True).replace(r'www\S+', '', regex=True)

 

删除包含空数据的行
在完成上述所有清理过程后,它在列中留下了一些空数据。我们必须摆脱那些空行,否则会在训练模型中产生不确定性。为了确保我们删除所有带有空数据的行,我们使用如下所示的两种方法。

"""
Drop Empty Rows
"""
df.dropna()

df['Type'].astype(bool)
df = df[df['Type'].astype(bool)]

第一行删除包含np.nan、pd.NaT和None 的所有行,而其他行删除包含空字符串字符的行。第二种方法很快,但如果该列甚至有空格,它将不起作用。这是我们更早剥离数据的另一个原因。
 

更多数据处理
有时您需要删除一些列、从现有数据创建一个新列或删除其中不包含特定数据的行。

"""
More Data Processing
"""
import numpy as np

df = df.drop(['Id', 'Name'], axis=1)
df = df[df['Type'].str.contains('frozen') | df['Type'].str.contains('green')]

def detect_price(row):
    if row['Price'] > 15.50:
        return 'High'
    elif row['Price'] > 5.50 and row['Price'] <= 15.50:
        return 'Medium'
    elif row['Price'] > 0.0 and row['Price'] <= 5.50:
        return 'Low'
    else:
        return np.NaN

df['Range'] = df.apply (lambda row: detect_price(row), axis=1)



在这里,第 3 行删除了名为Id和Name 的两列;并返回新数据帧的副本。第四行检查“类型”列是否包含字符串frozen 或green ,然后返回 true 并保留该行。第 7 到 17 行基于列“价格”的值创建一个名为“范围”的新列。通过使用 lambda 函数,我将每一行传递给detect_price函数并根据价格返回值。然后将此返回值分配给传递给函数的行上的新列。在这里,使用np.NaN 的一个原因是我们可以在之后使用df.dropna()删除这些行。

 

结论
数据清理过程是数据科学中涉及的众多过程之一。拥有干净准确的数据是因祸得福。我们需要在每个项目中以不同的方式清理和处理数据。我已经提到了一些经常使用的清洁方法。您也可以创建自己的方法集或使用任何一种现有方法。我在这里附上了整个代码以供参考。



 

猜你喜欢