Как выбрать уникальную строку по дате среди одинаковых строк?

Есть много строк, среди которых есть одинаковые строки по столбцу 'название', но у них разные даты.

Мне нужно чтобы оставалась только та строка из каждой группы, где дата самая свежая. Я уже 6-й час пытаюсь это сделать, но безуспешно. Может есть какие идеи, пожалуйста?


Ответы (2 шт):

Автор решения: sigalgleb

Если правильно вас понял, то у вас есть таблица, в которой, как минимум два столбца: название и дата, при этом название - не уникальный, дата - уникальный.

Предлагаю вам посмотреть в сторону следующего алгоритма:

  1. Пройтись по всем полям, сохраняя индексы (номера строк) для одинаковых названий;
  2. Параллельно сохранять даты для этих же индексов, это понадобится далее;
  3. Найти самую свежую дату и сохранить связанный с ней индекс, остальные удалить.

Вы можете повторить этот алгоритм для всех названий, выполняя скрипт несколько раз подряд, пока не останется одинаковых названий, либо дописать скрипт, чтобы он сразу группировал названия.

Будет очень полезно, если поделитесь своим кодом и текущими результатами, чтобы было от чего дополнительно отталкиваться.

→ Ссылка
Автор решения: MaxU

Решение с испольованием модуля Pandas:

  • читаем Excel файл в Pandas DataFrame
  • сортируем фрейм по датам
  • группируем отсортированный фрейм по наименованию
  • выбираем из каждой группы только одну последнюю строку
  • сохраняем результат в новый Excel файл

Пример:

import pandas as pd

df = pd.read_excel("filename.xlsx")
res = df.sort_values("date").groupby("name", as_index=False).last(1)
res.to_excel("result.xlsx", index=False)

Пример данных:

  name        date
0  aaa  2021-10-10
1  bbb  2020-01-01
2  aaa  2021-09-09
3  bbb  2020-02-02
4  ccc  2000-12-31

результат:

In [223]: df.sort_values("date").groupby("name", as_index=False).last(1)
Out[223]:
  name        date
0  aaa  2021-10-10
1  bbb  2020-02-02
2  ccc  2000-12-31

пример решения для опубликованного файла:

import pandas as pd

df = pd.read_excel("test2.xlsx", parse_dates=["Время договора"])
res = df.groupby("Наименование инструмента", as_index=False).apply(lambda x: x.nlargest(1, "Время договора"))
res.to_excel("result.xlsx", index=False)
→ Ссылка