SQL LAST_VALUE эквивалент в pandas - PullRequest
0 голосов
/ 12 марта 2020

Я ищу pandas, эквивалентный SQL функции окна Redshift LAST_VALUE ().

У меня есть pandas кадр данных отчетов с серийными номерами, которые добавляются ежедневно.

import pandas as pd

data = {'serial_num': [123456, 678901, 123456, 678901], 
'status': ['Good', 'Good', 'BAD', 'BAD'], 
'last_check':['2020-03-02','2020-03-02','2020-03-01','2020-03-01']}
new_br = pd.DataFrame.from_dict(data)


new_br

serial_num status last_check
123456     Good   2020-03-02
678901     Good   2020-03-02
123456     BAD    2020-03-01
678901     BAD    2020-03-01

Я хочу получить максимальное значение last_check, сгруппированное по serial_num, и сохранить все столбцы (в моем фактическом наборе данных есть больше столбцов).

Пока мой код:

new_br.set_index('last_check').groupby('serial_num').max()

serial_num  status
123456      Good
678901      Good

Однако это удаляет столбец last_check. Как сохранить столбец даты, аналогично функции LAST_VALUE () в SQL Redshift?

Мой ожидаемый результат:

serial_num  status last_check
123456      Good    2020-03-02
678901      Good    2020-03-02

1 Ответ

3 голосов
/ 12 марта 2020

Использование groupby.idxmax с loc:

data = {'serial_num': [123456, 678901, 123456, 678901], 
'status': ['Good', 'Good', 'BAD', 'BAD'], 
'last_check':['2020-03-02','2020-03-02','2020-03-01','2020-03-01']}
new_br = pd.DataFrame.from_dict(data)

print(new_br.dtypes)

# serial_num     int64
# status        object
# last_check    object
# dtype: object

# if last_check is not datetime dtype run this first
new_br['last_check'] = pd.to_datetime(new_br['last_check'])

new_br.loc[new_br.groupby('serial_num')['last_check'].idxmax()]

[out]

   serial_num status last_check
0      123456   Good 2020-03-02
1      678901   Good 2020-03-02
...