import pandas as pd
data=pd.DataFrame({
'ID': [133853.0,155755.0,149331.0,337270.0,
775727.0,200868.0,138453.0,738497.0,
666802.0,697070.0,128148.0,1042225.0,
303441.0,940515.0,143548.0],
'CLIENT':[235632.0,231562.0,235632.0,231562.0,734243.0,
235632.0,235632.0,734243.0,231562.0,734243.0,
235632.0,734243.0,231562.0,734243.0,235632.0],
'DATE_START': [('2017-09-01 00:00:00'), ('2017-10-05 00:00:00'),
('2017-09-26 00:00:00'), ('2018-03-23 00:00:00'),
('2018-12-21 00:00:00'), ('2017-11-23 00:00:00'),
('2017-09-08 00:00:00'), ('2018-12-12 00:00:00'),
('2018-11-21 00:00:00'), ('2018-12-01 00:00:00'),
('2017-08-22 00:00:00'), ('2019-02-06 00:00:00'),
('2018-02-20 00:00:00'), ('2019-01-20 00:00:00'),
('2017-09-17 00:00:00')]
})
data.groupby('CLIENT').apply(lambda df:
df[df['DATE_START'] == df['DATE_START'].max()].iloc[0][['ID', 'DATE_START']]
)
Выход:
CLIENT ID DATE_START
231562.0 666802.0 2018-11-21 00:00:00
235632.0 200868.0 2017-11-23 00:00:00
734243.0 1042225.0 2019-02-06 00:00:00
Давайте разберемся с этим:
1.) Группировать по CLIENT
. это сформирует итерируемую структуру данных, сгруппированную по CLIENT
.
2.) Применить функцию к каждому фрейму данных в группе с логикой (для этого предназначена часть apply(lambda df: ...)
)
3.) Для каждого фрейма данных найдите самый последний DATE_START
, а затем поднастроите каждый фрейм данных, чтобы показать только ID
с самым последним DATE_START
(для этого df[df['DATE_START'] == df['DATE_START'].max()]
).
4.) На данный момент я не знаю, какую логику вы хотите применить, если на одну и ту же дату поступило несколько заказов от клиента. В этом случае я использовал первое совпадение (.iloc[0]
).
5.) А потом я возвращаю ID
и DATE_START
.
6.) pandas
поймет, что вы хотите, чтобы логика, которую вы применили к каждому кадру данных в итерируемом элементе, объединялась по строкам, поэтому выходные данные таковы.
Дайте мне знать, если это то, что вы ищете.q