erge
@erge
Примус починяю

Как на pandas получить подобие оконной функции SQL?

просто подскажите можно ли и куда где смотреть, беглый тырнетпоиск результатов пока не дал... ((
надо сделать выборку как с sql row_number()

SELECT * FROM (
SELECT fields, row_number() over (partition by some_name order by date_time desc) n
) x WHERE n = 1
  • Вопрос задан
  • 1072 просмотра
Решения вопроса 2
Maksim_64
@Maksim_64
Data Analyst
Ну много способов есть, но самый верный смотреть в сторону groupby.
(
    df.
    assign(latest=lambda x:x
    .groupby("some_name")["date_time"]
    .transform(pd.Series.nlargest, 1)
          )
    .loc[lambda x: x['date_time'] == x['latest'],:]
)
Ответ написан
otdameskapizm
@otdameskapizm
Помог ответ? Отметь решением...
Можете попробовать вот такой способ (если я правильно понял ваш запрос с ранжированием и дальнейшей фильтрацией). Здесь используется группировка по определенной колонке, а затем внутри этой группы ранжируются значения. Выглядит вот так:

import pandas as pd

data = pd.DataFrame({
    'key_1' : ['x', 'x', 'x', 'y', 'y', 'y'],
    'key_2' : [1, 2, 3, 4, 5, 6]
})

# Здесь добавляете ранги внутри каждой из групп
data['rank'] = data \
    .groupby('key_1', as_index=False)['key_2'] \
    .rank(method='first', ascending=True) \

# Здесь происходит фильтрация по рангу
data = data.loc[data['rank'] == 1]


Вот здесь есть подробная документация для этого способа: https://pandas.pydata.org/docs/reference/api/panda...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
22 нояб. 2024, в 00:55
500 руб./за проект
21 нояб. 2024, в 23:30
300000 руб./за проект
21 нояб. 2024, в 22:21
3000 руб./в час