функция ранжирования row_number для фильтрации последних записей в DF - PullRequest
2 голосов
/ 17 июня 2020

Я хочу применить оконную функцию к DataFrame, чтобы получить только последние показатели для каждого идентификатора. Для следующих данных я ожидаю, что df будет содержать только первые две записи после применения функции окна.

| 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")

Ответы [ 2 ]

1 голос
/ 17 июня 2020

Вам нужно сначала отсортировать фрейм данных по идентификатору и дате (по убыванию). Затем вы делаете группу по идентификатору. Первый метод в группе по объектам вернет первую строку (с самой последней датой).

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()




0 голосов
/ 18 июня 2020
  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  |
  //      +---+----------------+------+
...