【问题标题】:Pyspark / Python - Use MIN / MAX without losing columns [duplicate]Pyspark / Python - 使用 MIN / MAX 而不会丢失列 [重复]
【发布时间】:2018-01-15 21:18:35
【问题描述】:

我有一个这样的数据框:

----------------------------------------------
| User_ID |      Timestamp      | Article_ID |
----------------------------------------------
| 121212  | 2018-01-15 10:00:00 |      1     |
| 121212  | 2018-01-15 10:05:00 |      11    |
| 121212  | 2018-01-15 10:10:00 |      12    |
| 989898  | 2018-01-15 17:30:00 |      100   |
| 989898  | 2018-01-15 17:40:00 |      200   |
| 989898  | 2018-01-15 17:50:00 |      1     |
| 989898  | 2018-01-15 17:55:00 |      11    |
|...      |                     |            |
----------------------------------------------

现在我想要每个 User_ID 具有最小时间戳的行。 结果应该是:

----------------------------------------------
| User_ID |      Timestamp      | Article_ID |
----------------------------------------------
| 121212  | 2018-01-15 10:00:00 |      1     |
| 989898  | 2018-01-15 17:30:00 |      100   |
|...      |                     |            |
----------------------------------------------

我尝试了以下方法:

df.groupBy('User_ID').agg(F.min('Timestamp')).show()

这还不错,但是缺少“Article_ID”列... 有人可以帮我吗?

【问题讨论】:

    标签: python apache-spark pyspark apache-spark-sql


    【解决方案1】:

    我找到了一个使用函数 struct() 的可行解决方案:

    df.select('User_ID',F.struct('Timestamp','Article_ID').alias("TA")).groupBy('User_ID').agg(F.min("TA").alias("TA")).select('User_ID','TA.Timestamp','TA.Article_ID').orderBy('User_ID').limit(10).toPandas()
    

    另见原始来源:How to select the first row of each group?

    【讨论】:

    • 如果您使用其他答案的解决方案,请不要忘记required attribution
    • 感谢您的来信。我添加了原始来源...
    猜你喜欢
    • 2017-09-23
    • 1970-01-01
    • 1970-01-01
    • 2022-07-26
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    • 2022-01-19
    • 1970-01-01
    相关资源
    最近更新 更多