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

pyspark-分组并选择N个最高值

文自怡
2023-03-14

我有这样的数据

+----------+----------+--------+
| Location | Product  | Amount |
+----------+----------+--------+
| London   | Fish     |    307 |
| London   | Chips    |    291 |
| London   | Beer     |    147 |
| Paris    | Baguettes|    217 |
| Paris    | Cheese   |    103 |
| Paris    | Champagne|     74 |
+----------+----------+--------+

自然有许多地点和许多产品每个地点。我希望以这样的数据流结束:

+----------+---------------------+-------------------------+-------+-------------------------+
| Location | Most Common Product | 2nd Most Common Product |.....  | Nth Most Common Product |
+----------+---------------------+-------------------------+-------+-------------------------+
| London   | Fish                | Chips                   | ....  |     something           |
| Paris    | Baguettes           | Cheese                  | ....  |     something else      |
+----------+---------------------+-------------------------+-------+-------------------------+

我想出了最常见的方法,用这个。

在将其扩展到N个最常见的时,我可以创建另一个删除这些行的dataframe,再次运行该过程以获得第二个最常见的,并按位置将它们连接在一起。通过适当的列命名,可以将其放入循环中运行N次,每次迭代添加一个列。

然而,这将是非常缓慢的,因为它将划分和加入每个迭代。例如,我如何以更好的方式获得每个位置最常见的50个?

共有1个答案

皇甫繁
2023-03-14

您可以使用枢轴-

首先,您需要创建一个row_number,然后在此基础上应用Pivot-

from pyspark.sql.functions import first
from pyspark.sql import functions as f

df_data.withColumn("row_number", f.row_number().over(Window.partitionBy("Location").orderBy(col("unit_count").desc())))

(df_data
    .groupby(df_data.Location)
    .pivot("row_number")
    .agg(first("Product"))
    .show())
 类似资料:
  • 问题内容: 我真的很困惑查询需要返回在特定列上具有最大值的前N行。 例如,如果行具有相同的值。我必须返回还是要排。 问题答案: 如果您这样做: 您将获得前N行。 如果您这样做: 或者,您可以将其表达为: 从概念上讲,以下是您想要执行的操作,但在MySQL中可能不起作用:

  • 问题内容: 如何从表中选择前n个最大值? 对于这样的表: 对于n = 2,结果需要为: 下面的方法仅为每个组选择最大值。 返回值: 问题答案: 对于n = 2,您可以 对于任何n,您都可以使用此处介绍的方法模拟分区之上的排名。 编辑:其实这个文章会给你你需要什么。 基本上是这样的 用要分组的列的名称和保存值的列的名称替换。 要弄清楚它的功能是如何进行的,请从最内部的查询中逐步进行并运行它们。 而且

  • 问题内容: 我有包含以下字段的表: 如何创建SQL,请选择按ID,DATE_FROM,DATE_TO对结果进行分组并从价格中选择最低的值。 所以结果是 问题答案:

  • 我有一个包含三列字符串的数据框。我知道第三列中只有一个值对前两列的每个组合都有效。要清理数据,我必须按数据帧按前两列进行分组,并为每个组合选择第三列的最常用值。 我的代码: 最后一行代码不起作用,它说“关键错误‘简称’”,如果我试图只按城市分组,那么我得到了一个断言错误。我能做什么来修复它?

  • 我要做的是合并几行数据以显示为单行。基于行的最高值。因此只保留具有最高值的记录 由此得出: 对此: 欢迎提出任何建议。 多谢了。

  • 问题内容: 假设有工资表: 我目前正在使用此代码(AutoIT脚本: 因此,如果Hour_number在低小时或高小时之间,那两个查询是完美的。我需要某种查询,它基本上会执行以下操作: 然后将其重复为“默认”,因为找不到该员工。 补充:如果仅通过1个查询未找到$ Employee,是否可以尝试使用“ Default”? 问题答案: 如果仅通过1个查询未找到$ Employee,是否可以尝试使用“