【问题标题】:row_number ranking function to filter the latest records in DFrow_number 排序函数过滤 DF 中的最新记录
【发布时间】:2020-10-07 18:45:31
【问题描述】:

我想将 Window 函数应用于 DataFrame 以仅获取每个 Id 的最新指标。对于以下数据,我希望 df 在应用 Window 函数后仅包含前两条记录。

| id | metric | transaction_date |
| 1  | 0.5    |  05-10-2019      | 
| 2  | 15.9   |  07-22-2020      |
| 2  | 4.7    |  11-03-2017      |

使用row_number排名功能是否正确?我当前的实现如下所示:

    df.withColumn(
        "_row_number",
        F.row_number().over(
            Window.partitionBy("id").orderBy(F.desc("transaction_date")))
    )
    .filter(F.col("_row_number") == 1)
    .drop("_row_number")

【问题讨论】:

  • df.sort_values(by='transaction_date').groupby(by='id').head(-1)这对你有用吗?
  • 我认为.head(-1) 只会给你一行。 .first() 将给出每个 groupby 的第一行。
  • 这看起来不错,可以满足您的需求。为什么你认为这不是正确的做法?

标签: python python-3.x dataframe pyspark apache-spark-sql


【解决方案1】:

您需要先按 id 和日期(降序)对数据框进行排序。然后你按 id 分组。按对象分组的第一个方法将返回第一行(具有最新日期)。

import pandas as pd
from datetime import datetime

df = pd.DataFrame({'id':[1,2,2], 
'metric':[0.5, 15.9, 4.7], 
'date':[datetime(2019,5,10), datetime(2020,7,22), datetime(2017,11,3)]})


## sort df by id and date
df = df.sort_values(['id','date'], ascending= [True, False])

## return the first row of each group
df.groupby('id').first()




【讨论】:

    【解决方案2】:
      val fDF = Seq( (1, 0.5,  "05-10-2019"),
        (2, 15.9,  "07-22-2020"),
        (2, 4.7,  "11-03-2017"))
        .toDF("id", "metric", "transaction_date")
    
      val f1DF = fDF
        .withColumn("transaction_date", to_date('transaction_date, "MM-dd-yyyy"))
        .orderBy('id.asc,'transaction_date.desc)
    
      val f2DF = f1DF.groupBy("id")
        .agg(first('transaction_date).alias("transaction_date"),
          first('metric).alias("metric"))
    
      f2DF.show(false)
      //      +---+----------------+------+
      //      |id |transaction_date|metric|
      //      +---+----------------+------+
      //      |1  |2019-05-10      |0.5   |
      //      |2  |2020-07-22      |15.9  |
      //      +---+----------------+------+
    

    【讨论】:

    • 第一个函数是不确定的 - 此解决方案将在集群模式下给出不一致的结果
    猜你喜欢
    • 1970-01-01
    • 2010-09-22
    • 2013-08-25
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多