Как выбрать уникальную строку по дате среди одинаковых строк?
Есть много строк, среди которых есть одинаковые строки по столбцу 'название', но у них разные даты.
Мне нужно чтобы оставалась только та строка из каждой группы, где дата самая свежая. Я уже 6-й час пытаюсь это сделать, но безуспешно. Может есть какие идеи, пожалуйста?
Ответы (2 шт):
Если правильно вас понял, то у вас есть таблица, в которой, как минимум два столбца: название и дата, при этом название - не уникальный, дата - уникальный.
Предлагаю вам посмотреть в сторону следующего алгоритма:
- Пройтись по всем полям, сохраняя индексы (номера строк) для одинаковых названий;
- Параллельно сохранять даты для этих же индексов, это понадобится далее;
- Найти самую свежую дату и сохранить связанный с ней индекс, остальные удалить.
Вы можете повторить этот алгоритм для всех названий, выполняя скрипт несколько раз подряд, пока не останется одинаковых названий, либо дописать скрипт, чтобы он сразу группировал названия.
Будет очень полезно, если поделитесь своим кодом и текущими результатами, чтобы было от чего дополнительно отталкиваться.
Решение с испольованием модуля 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)