PySpark 通过条件删除DataFrame中的行
对数据帧应用条件对程序员非常有益。我们可以验证数据以确保其符合我们的模型。我们可以通过应用条件和筛选数据帧中的无关数据来操纵数据帧,从而改善数据可视化。在本文中,我们将执行类似的操作,将条件应用于PySpark数据帧并从中删除行。Pyspark提供实时数据处理。它是Apache Spark的API,允许程序员在本地的Python环境中创建Spark框架。
示例
现在我们已经对PySpark数据帧有了基本的了解,让我们创建一个。在这里,
- 我们从“spark.sql”中导入了一个“SparkSession”。这个会话作为使用“Spark APIs”的入口点,并允许我们根据我们自己的意愿配置数据帧。我们为一个应用程序创建一个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的行。
-
满足条件的列对应的行将被保留,即“Row 1”和“Row 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数据框中删除行。我们创建了一个数据框,然后针对单个列进行了操作。然后我们对多个列应用了条件并删除了行。