在 PySpark DataFrame 中根据条件删除行


对数据帧应用条件对于程序员来说非常有用。我们可以验证数据以确保它符合我们的模型。我们可以通过应用条件来操作数据帧并过滤掉数据帧中不相关的数据,从而改进数据可视化。在本文中,我们将执行类似的操作,即对 PySpark 数据帧应用条件并从中删除行。Pyspark 提供实时数据处理。它是 Apache Spark 的一个 API,允许程序员在本地 Python 环境中创建 Spark 框架。

示例

现在我们已经对 PySpark 数据帧有了基本的了解,让我们创建一个。这里,

  • 我们从 “spark.sql” 中导入了 “SparkSession”。此会话充当使用 “Spark API” 的入口点,并允许我们根据自己的意愿配置数据帧。我们只为一个应用程序创建一个 SparkSession,然后在整个代码库中使用它。

  • 我们传递了一个包含有关菜肴信息(包括名称、价格、评分和折扣)的字典数据集。我们使用该数据集创建了一个 Pandas 数据帧。

  • 然后将 Pandas 数据帧作为 “.createDataFrame” 方法的参数传递,以创建 Spark 数据帧。

  • 最后,我们使用 “show()” 方法显示了数据帧。

from pyspark.sql import SparkSession
import pandas as pd

sparkOBJ = SparkSession.builder.appName("DscSpark").getOrCreate()
dataset = {"Dish name": ["Biryani", "Fish", "Mashed potatoes", "Salad"], "Price": [250, 350, 180, 200], "Rating":[9, 7, 8, 6], "discount %":[20, 30, 10, 15]}

dataframe_pd = pd.DataFrame(dataset, index=[1, 2, 3, 4])

dataframe_spk = sparkOBJ.createDataFrame(dataframe_pd)
print("The original data frame is: -")
dataframe_spk.show()

输出

The original data frame is: -
+---------------+-----+------+----------+
|      Dish name|Price|Rating|discount %|
+---------------+-----+------+----------+
|        Biryani|  250|     9|        20|
|           Fish|  350|     7|        30|
|Mashed potatoes|  180|     8|        10|
|          Salad|  200|     6|        15|
+---------------+-----+------+----------+

现在我们已经创建了一个 Spark 数据帧,我们将对其列应用条件以从中删除行。

对单个列应用条件

我们将从一个简单的针对单个列的任务开始。让我们在这里构建代码,

  • 在创建数据帧后,我们使用 “filter()” 函数删除 “Rating” 列值大于 8 的行。

  • 保留了第 3 行和第 4 行。

  • 我们创建了一个新的数据帧来保存对原始数据帧所做的更改。

示例

from pyspark.sql import SparkSession
import pandas as pd

sparkOBJ = SparkSession.builder.appName("DscSpark").getOrCreate()
dataset = {"Dish name": ["Biryani", "Fish", "Mashed potatoes", "Salad"], "Price": [250, 350, 180, 200],
           "Rating":[9, 7, 8, 6], "discount %":[20, 30, 10, 15]}

dataframe_pd = pd.DataFrame(dataset)

dataframe_spk = sparkOBJ.createDataFrame(dataframe_pd)
print("The original data frame is: -")
dataframe_spk.show()

dataframe_fil = dataframe_spk.filter(dataframe_spk.Rating < 8)
dataframe_fil.show()

输出

The original data frame is: -
+---------------+-----+------+----------+
|      Dish name|Price|Rating|discount %|
+---------------+-----+------+----------+
|        Biryani|  250|     9|        20|
|           Fish|  350|     7|        30|
|Mashed potatoes|  180|     8|        10|
|          Salad|  200|     6|        15|
+---------------+-----+------+----------+

+--------+-----+------+----------+
|Dishname|Price|Rating|discount %|
+--------+-----+------+----------+
|    Fish|  350|     7|        30|
|   Salad|  200|     6|        15|
+--------+-----+------+----------+

对多列应用条件

为了提高数据帧的特定性和简化数据分析,我们可以在数据帧的多个列上应用某些条件。这种方法通过从数据帧中消除不必要的行来提高数据处理效率。

我们将使用 “&” 运算符来定位多列,因为在 Spark 数据帧的情况下,表达式在所有行上逐元素计算。因此,我们需要一个 “逐元素逻辑运算符”。

示例

让我们看看代码以更好地理解。

  • 在创建数据帧后,我们使用 filter() 函数删除 “Rating” 列值小于 7 且 “Price” 列大于 300 的行。

  • 保留满足条件的列对应的行,即“行 1”和“行 3”。

from pyspark.sql import SparkSession
import pandas as pd

sparkOBJ = SparkSession.builder.appName("DscSpark").getOrCreate()
dataset = {"Dish name": ["Biryani", "Fish", "Mashed potatoes", "Salad"], "Price": [250, 350, 180, 200], "Rating":[9, 7, 8, 6], "discount%":[20, 30, 10, 15]}

dataframe_pd = pd.DataFrame(dataset)

dataframe_spk = sparkOBJ.createDataFrame(dataframe_pd)
print("The original data frame is: -")
dataframe_spk.show()
dataframe_fil = dataframe_spk.filter((dataframe_spk.Rating > 7) & (dataframe_spk.Price < 300))
dataframe_fil.show()

输出

The original data frame is: -
+---------------+-----+------+---------+
|      Dish name|Price|Rating|discount%|
+---------------+-----+------+---------+
|        Biryani|  250|     9|       20|
|           Fish|  350|     7|       30|
|Mashed potatoes|  180|     8|       10|
|          Salad|  200|     6|       15|
+---------------+-----+------+---------+

+--------+-----+------+---------+------+
|      Dish name|Price|Rating|discount%|
+--------+-----+------+---------+------+
|        Biryani|  250|     9|       20|
|Mashed potatoes|  180|     8|       10|
+--------+-----+------+---------+------+

结论

在本文中,我们讨论了通过对列应用条件从 PySpark 数据帧中删除行的不同方法。我们创建了一个数据帧,然后定位了一个单列。之后,我们对多列应用了条件并删除了行。

更新于: 2023年5月5日

1K+ 阅读量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告