Python 使用Dropna在Pyspark中清理数据

Python 使用Dropna在Pyspark中清理数据

为了确保数据准确、可信、适合预期的分析,清理数据是任何数据分析或数据科学工作的关键步骤。Pyspark中的数据清理函数,如dropna,使其成为处理大型数据集的有力工具。

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 - 该参数指定如果行或列的任何值为空,则是删除行还是列。如果值为 ‘any’,则如果有任何一个值为空,就会删除行或列。如果值为 ‘all’,则仅当所有值都为空时才会删除行或列。

  • thresh - 该参数指定保留行或列所需的最小非空值数量。如果行或列中的非空值数量小于thresh值,那么该行或列将被删除。

  • subset - 该参数指定检查空值时要考虑的列的子集。如果指定子集中的任何值为空,则会删除行或列。

通过使用适当的参数调用dropna()函数,您可以清理DataFrame并删除任何空值或缺失值。这很重要,因为空值或缺失值可能导致分析结果不准确,删除它们将提高数据的准确性和可靠性。此外,dropna()是一个多功能函数,可用于小型和大型数据集,是Pyspark中任何数据清理项目的重要工具。

在利用dropna方法删除空值之前,我们必须首先创建一个Pyspark DataFrame。一旦创建了DataFrame,我们就可以继续应用dropna方法来消除DataFrame中存在的任何空值。

您能够运行本教程中的代码的前提是安装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|
+----+------+------------------+-----------------------------+

使用dropna和任意参数在PySpark中清洗数据

在下面的代码中,dropna()函数使用参数how=”any”被调用。该参数指定任何包含空值的行或列都将从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 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中的dropna和所有参数清理数据

在下面的代码中,使用参数how=”all”调用dropna()函数。这个参数指定任何只包含空值的行或列将从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 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|
+---+------+------------------+--------------------------+

使用thresh参数在PySpark中使用dropna方法清理数据

在下面的代码中,使用参数thresh=2调用dropna()方法。该参数指定如果行或列中包含少于两个非空值,则将丢弃该行或列。

使用thresh参数在PySpark中使用dropna方法清理数据。

示例

# 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 来清洗数据

在下面的代码中,我们在 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中删除包含空值的行或列。

通过指定不同的参数,如how和thresh,用户可以选择函数的行为并自定义清洗过程。总体而言,dropna()函数是一个强大的数据清洗工具,有助于提高数据质量并增强后续分析或建模的准确性。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程