使用Pyspark中的Dropna清理数据
为了确保数据准确、可靠并适合预期的分析,数据清理是任何数据分析或数据科学工作中至关重要的一步。Pyspark 中的数据清理函数(如 dropna)使其成为处理大型数据集的强大工具。
Pyspark 中的 dropna 函数允许您从 DataFrame 中删除包含缺失值或空值的行。缺失值或空值可能由于各种原因出现在 DataFrame 中,例如数据不完整、数据输入错误或数据格式不一致。删除这些行有助于确保数据质量,以便进行后续分析。
Dropna 是一款多功能函数,允许您指定删除行的条件。您可以指定要沿其删除行的轴(0 表示行,1 表示列),保留行所需的最小非空值阈值,以及在检查缺失值时要考虑的列的子集。此外,dropna 支持不同的处理缺失值的方法,例如删除任何缺失值的行,仅删除特定列中缺失值的行,或根据时间阈值删除行。
在 Pyspark 中使用 dropna 可以显著提高数据质量和可靠性。通过删除包含缺失值或空值的行,您可以确保您的分析基于完整且准确的数据。凭借其灵活性和易用性,dropna 是任何 Pyspark 用户数据清理工具包中必不可少的工具。
在本文中,我们将讨论清理 DataFrame 的过程以及使用 dropna() 函数来实现这一目标。清理 DataFrame 的主要目的是确保它包含准确可靠的数据,这些数据适合分析。
dropna() 函数的语法如下
df.dropna(how="any", thresh=None, subset=None)
其中 df 是要清理的 DataFrame。该函数接受三个参数
how − 此参数指定如果任何值为 null,则是否删除行或列。如果值为“any”,则如果任何值为 null,则将删除该行或列。如果值为“all”,则仅当所有值为 null 时才会删除该行或列。
thresh − 此参数指定保留行或列所需的最小非空值数。如果行或列中的非空值数小于 thresh 值,则将删除该行或列。
subset − 此参数指定在检查 null 值时要考虑的列的子集。如果指定子集中任何值为 null,则将删除该行或列。
通过使用带适当参数的 dropna() 函数,您可以清理 DataFrame 并删除任何 null 或缺失值。这很重要,因为 null 或缺失值可能导致分析不准确,删除它们将提高数据的准确性和可靠性。此外,dropna() 是一款多功能函数,可用于小型和大型数据集,使其成为任何 Pyspark 数据清理项目中必不可少的工具。
在利用 dropna 方法删除 null 值之前,我们必须首先创建一个 Pyspark DataFrame。创建 DataFrame 后,我们可以继续应用 dropna 方法以消除 DataFrame 中存在的任何 null 值。
能够运行本教程中的代码的先决条件是安装 pyspark 模块。
以下命令将安装 pyspark 模块。
命令
pip3 install pyspark
请考虑以下所示代码。
示例
# importing necessary libraries from pyspark.sql import SparkSession # function to create new SparkSession def create_session(): spk = SparkSession.builder \ .master("local") \ .appName("Employee_detail.com") \ .getOrCreate() return spk # function to create DataFrame from data and schema def create_df(spark, data, schema): df1 = spark.createDataFrame(data, schema) return df1 if __name__ == "__main__": # calling function to create SparkSession spark = create_session() # creating sample data with different data types input_data = [(1, "John", "Data Scientist", "Seattle"), (2, None, "Software Developer", None), (3, "Emma", "Data Analyst", "New York"), (4, None, None, "San Francisco"), (5, "Andrew", "Android Developer", "Los Angeles"), (6, "Sarah", None, None), (None, None, None, None)] # creating schema for DataFrame schema = ["Id", "Name", "Job Profile", "City"] # calling function to create dataframe df = create_df(spark, input_data, schema) # displaying the created DataFrame df.show()
解释
此代码演示了如何在 PySpark 中创建新的 SparkSession 和 DataFrame。为此,它导入了创建 SparkSession 所需的库。
接下来,定义了一个名为 create_session() 的函数,该函数设置并配置一个新的 SparkSession。此函数指定 Spark 应在单个节点上本地运行,设置应用程序的名称,并创建新的 SparkSession 或返回现有的 SparkSession。
接下来定义 create_df() 函数,该函数使用输入数据和模式创建一个新的 DataFrame。此函数以 SparkSession、输入数据和模式作为输入,并返回一个新的 DataFrame。
输入数据是元组列表,其中每个元组表示 DataFrame 中的一行。模式是列名列表,其中每个名称对应于 DataFrame 中的一列。
最后,代码的主要部分调用 create_session() 函数以创建一个新的 SparkSession,定义 DataFrame 的输入数据和模式,并调用 create_df() 函数以使用输入数据和模式创建一个新的 DataFrame。然后,使用 .show() 方法打印生成的 DataFrame。
要运行以上代码,我们需要运行以下所示的命令。
命令
python3 main.py
运行以上命令后,我们可以预期输出与以下所示的输出相同。
输出
+----+------+------------------+------------------------------+ | Id| Name| Job Profile| City| +----+------+------------------+------------------------------+ | 1| John| Data Scientist| Seattle| | 2| null| Software Developer| null| | 3| Emma| Data Analyst| New York| | 4| null| null| San Francisco| | 5|Andrew| Android Developer| Los Angeles| | 6| Sarah| null| null| | null| null| null| null| +----+------+------------------+-----------------------------+
使用 PySpark 中的 any 参数清理数据。
在下面的代码中,dropna() 函数以参数 how="any" 调用。此参数指定 DataFrame 中包含任何 Null 值的任何行或列都将被删除。
请考虑以下所示代码。
示例
# importing necessary libraries from pyspark.sql import SparkSession # function to create new SparkSession def create_session(): spk = SparkSession.builder \ .master("local") \ .appName("Employee_detail.com") \ .getOrCreate() return spk # function to create DataFrame from data and schema def create_df(spark, data, schema): df1 = spark.createDataFrame(data, schema) return df1 if __name__ == "__main__": # calling function to create SparkSession spark = create_session() # creating sample data with different data types input_data = [(1, "John", "Data Scientist", "Seattle"), (2, None, "Software Developer", None), (3, "Emma", "Data Analyst", "New York"), (4, None, None, "San Francisco"), (5, "Andrew", "Android Developer", "Los Angeles"), (6, "Sarah", None, None), (None, None, None, None)] # creating schema for DataFrame schema = ["Id", "Name", "Job Profile", "City"] # calling function to create dataframe df = create_df(spark, input_data, schema) # displaying the created DataFrame # df.show() # if any row of the is having any Null # value we are dropping that # rows df = df.dropna(how="any") df.show()
要运行以上代码,我们需要运行以下所示的命令。
命令
python3 main.py
运行以上命令后,我们可以预期输出与以下所示的输出相同。
输出
+---+------+-----------------+--------------------+ | Id| Name| Job Profile| City| +---+------+-----------------+--------------------+ | 1| John| Data Scientist| Seattle| | 3| Emma| Data Analyst| New York| | 5| Andrew| Android Developer| Los Angeles| +---+------+-----------------+--------------------+
使用 PySpark 中的 all 参数清理数据。
在下面的代码中,dropna() 函数以参数 how="all" 调用。此参数指定 DataFrame 中仅包含 Null 值的任何行或列都将被删除。
请考虑以下所示代码。
示例
# importing necessary libraries from pyspark.sql import SparkSession # function to create new SparkSession def create_session(): spk = SparkSession.builder \ .master("local") \ .appName("Employee_detail.com") \ .getOrCreate() return spk # function to create DataFrame from data and schema def create_df(spark, data, schema): df1 = spark.createDataFrame(data, schema) return df1 if __name__ == "__main__": # calling function to create SparkSession spark = create_session() # creating sample data with different data types input_data = [(1, "John", "Data Scientist", "Seattle"), (2, None, "Software Developer", None), (3, "Emma", "Data Analyst", "New York"), (4, None, None, "San Francisco"), (5, "Andrew", "Android Developer", "Los Angeles"), (6, "Sarah", None, None), (None, None, None, None)] # creating schema for DataFrame schema = ["Id", "Name", "Job Profile", "City"] # calling function to create dataframe df = create_df(spark, input_data, schema) # displaying the created DataFrame # df.show() # if any row of the is having all Null # value we are dropping that # rows df = df.dropna(how="all") df.show()
要运行以上代码,我们需要运行以下所示的命令。
命令
python3 main.py
运行以上命令后,我们可以预期输出与以下所示的输出相同。
输出
+---+------+------------------+--------------------------+ | Id| Name| Job Profile| City| +---+------+------------------+--------------------------+ | 1| John| Data Scientist| Seattle| | 2| null| Software Developer| null| | 3| Emma| Data Analyst| New York| | 4| null| null| San Francisco| | 5|Andrew| Android Developer| Los Angeles| | 6| Sarah| null| null| +---+------+------------------+--------------------------+
使用 PySpark 中的 thresh 参数清理数据。
在下面的代码中,dropna() 函数以参数 thresh=2 调用。此参数指定 DataFrame 中包含少于两个非空值的任何行或列都将被删除。
使用 PySpark 中的 thresh 参数清理数据。
示例
# importing necessary libraries from pyspark.sql import SparkSession # function to create new SparkSession def create_session(): spk = SparkSession.builder \ .master("local") \ .appName("Employee_detail.com") \ .getOrCreate() return spk # function to create DataFrame from data and schema def create_df(spark, data, schema): df1 = spark.createDataFrame(data, schema) return df1 if __name__ == "__main__": # calling function to create SparkSession spark = create_session() # creating sample data with different data types input_data = [(1, "John", "Data Scientist", "Seattle"), (2, None, "Software Developer", None), (3, "Emma", "Data Analyst", "New York"), (4, None, None, "San Francisco"), (5, "Andrew", "Android Developer", "Los Angeles"), (6, "Sarah", None, None), (None, None, None, None)] # creating schema for DataFrame schema = ["Id", "Name", "Job Profile", "City"] # calling function to create dataframe df = create_df(spark, input_data, schema) # displaying the created DataFrame # df.show() # if thresh value is not # satisfied then dropping # that row df = df.dropna(thresh=2) df.show()
要运行以上代码,我们需要运行以下所示的命令。
命令
python3 main.py
运行以上命令后,我们可以预期输出与以下所示的输出相同。
输出
+---+------+------------------+--------------------------+ | Id| Name| Job Profile| City| +---+------+------------------+--------------------------+ | 1| John| Data Scientist| Seattle| | 2| null| Software Developer| null| | 3| Emma| Data Analyst| New York| | 4| null| null| San Francisco| | 5|Andrew| Android Developer| Los Angeles| | 6| Sarah| null| null| +---+------+------------------+--------------------------+
使用 PySpark 中的 subset 参数清理数据。
在以下代码中,我们在 dropna() 函数中传递了 subset='City' 参数,它是 City 列的列名,如果该列中存在任何 NULL 值,那么我们将从 Dataframe 中删除该行。
请考虑以下所示代码。
示例
# importing necessary libraries from pyspark.sql import SparkSession # function to create new SparkSession def create_session(): spk = SparkSession.builder \ .master("local") \ .appName("Employee_detail.com") \ .getOrCreate() return spk # function to create DataFrame from data and schema def create_df(spark, data, schema): df1 = spark.createDataFrame(data, schema) return df1 if __name__ == "__main__": # calling function to create SparkSession spark = create_session() # creating sample data with different data types input_data = [(1, "John", "Data Scientist", "Seattle"), (2, None, "Software Developer", None), (3, "Emma", "Data Analyst", "New York"), (4, None, None, "San Francisco"), (5, "Andrew", "Android Developer", "Los Angeles"), (6, "Sarah", None, None), (None, None, None, None)] # creating schema for DataFrame schema = ["Id", "Name", "Job Profile", "City"] # calling function to create dataframe df = create_df(spark, input_data, schema) # displaying the created DataFrame # df.show() # if the subset column any value # is NULL then we drop that row df = df.dropna(subset="City") df.show()
要运行以上代码,我们需要运行以下所示的命令。
命令
python3 main.py
运行以上命令后,我们可以预期输出与以下所示的输出相同。
输出
+---+------+-----------------+--------------------------------+ | Id| Name| Job Profile| City| +---+------+-----------------+--------------------------------+ | 1| John| Data Scientist| Seattle| | 3| Emma| Data Analyst| New York| | 4| null| null| San Francisco| | 5|Andrew| Android Developer| Los Angeles| +---+------+-----------------+--------------------------------+
结论
总之,在进行任何分析或建模之前,数据清理是数据预处理中不可或缺的一部分。在 Python 中,Pandas 库中的 dropna() 函数和 PySpark DataFrame API 提供了一种简单有效的方法来从 DataFrame 中删除包含 Null 值的行或列。
通过指定不同的参数(如 how 和 thresh),用户可以选择函数的行为并自定义清理过程。总的来说,dropna() 函数是数据清理的强大工具,有助于提高数据质量并提高后续任何分析或建模的准确性。