当前位置: 首页 > 知识库问答 >
问题:

返回dataframe中满足一个条件的行,同时修复另一列的值

楚苏燕
2023-03-14
Genres | Year | Number_Movies
Drama  |2015  | 705
Romance|2015  | 203
Comedy |2015  | 586
Drama  |2014  | 605
Romance|2014  | 293
Comedy |2014  | 786
Genres | Year | Number_Movies
Drama  |2015  | 705
Comedy |2014  | 786

如果可能请帮忙。多谢.

共有1个答案

翟兴邦
2023-03-14

这里有几个可以解决这个问题的选择-

df = spark.createDataFrame([('Drama',2015,705),('Romance',2015,203),('Comedy',2015,586),('Drama',2014,605),('Romance',2014,293),('Comedy ',2014,786)],['Genres','Year','Number_Movies'])

第一个选项:使用窗口函数定义一个等级(分区按年和顺序按Number_Movies desc)。每年数量最多的电影将获得“1”级。

from pyspark.sql.window import Window
from pyspark.sql.functions import row_number,desc

w = Window.partitionBy("Year").orderBy(desc("Number_Movies"))
rank = row_number().over(w).alias('rank')

df.withColumn("rank", rank)\
    .where("rank=1")\
    .drop("rank")\
    .show()

#+-------+----+-------------+
#| Genres|Year|Number_Movies|
#+-------+----+-------------+
#|Comedy |2014|          786|
#|  Drama|2015|          705|
#+-------+----+-------------+

第二个选项:获取每年Number_Movies的最大值,然后self加入dataframe以获取类型。

from pyspark.sql.functions import max,col

joining_condition = [col('a.Year') == col('b.Year'), col('a.max_Number_Movies') == col('b.Number_Movies')]

df.groupBy("Year").\
    agg(max("Number_Movies").alias("max_Number_Movies")).alias("a").\
    join(df.alias("b"),  joining_condition).\
    selectExpr("b.Genres","b.Year","b.Number_Movies").\
    show()

#+-------+----+-------------+
#| Genres|Year|Number_Movies|
#+-------+----+-------------+
#|Comedy |2014|          786|
#|  Drama|2015|          705|
#+-------+----+-------------+
 类似资料:
  • 我是R的新手,这是我关于堆栈溢出的第一个问题。 我正在努力 要通过引用指定新列,请执行以下操作: 对于每行 使用同一行组中第一行到下一行的值。 这符合一个条件 示例数据: 我想做的是 子集(组)按 对于每行 查找进一步向下的第一行的, 其中,和(找到的行)大于我正在更新的行的 我的预期结果是: 我使用<code>尝试了许多变体。SD,,创建一个新的列,其中包含但实际上没有得到任何结果。非常感谢任何

  • 我有一个很好的方法。这就是它的样子。 我想把这个换成Lambda。但我不知道如何填写if(条件)在外面返回true或false。我知道我也可以在流中完成。有人能举个例子吗?

  • 我正在尝试使用一个do while循环来找出用户是想将一只狗还是一只猫检查到Java的养狗系统中。其思想是,当提示时输入“dog”或“cat”,任何输入都将导致错误,并且他们将再次被提示输入文件名。 如果输入了“cat”或“dog”,那么将为程序分配等效的文件(dogs.txt或cats.txt),然后系统将运行并将数据加载到程序中。 以下是当前的变量: 以及导致问题的方法: 下面是运行代码时打印

  • 我正处于Java的学习阶段。我想用Java编写一个程序,它可以读取一个Excel文件(.xlsx)。此文件有一些列和许多行。我想将数据写入另一个Excel文件(.xlsx),仅满足条件,而不是现有文件中的所有数据。 我的Excel工作表如下所示 我想只过滤那些带有代理Edelweiss的行,并把它放在另一个Excel表中。我知道如何使用Java将一个Excel中的所有数据复制到另一个Excel中。

  • 我正在写一些代码,有些事情让我困惑。我有一个名为的数字数组。现在我想遍历这个列表,如果一个值高于60,例如,我想创建一个新的对象数组(集合),在那里我们存储高值,它的索引来自原始数组。所以以下面的代码为例 控制台。日志输出如下 这个输出是我所需要的,但是如何防止返回未定义的值呢?我考虑过使用数组。但这似乎不合适?我应该使用不同的数组方法吗?我不想使用for循环并推送到一个新数组,除非这是在不返回未

  • 我有一个很管用的方法。这是看起来的样子。 我想把这个换成兰姆达。里面带着shell来了uo,但是我不知道怎么填充if(条件)返回true还是返回false外面。