Первый раз отправляю Q, поэтому заранее извиняюсь
У меня большой набор данных о маршрутах путешествий.Я хочу сгруппировать лист ('cust_id') и пометить каждый отдельный маршрут (['предложение']).
cust_id date item_type dep proposal
4 20/12/2017 00:00 arrive none 1
4 . depart arrive 1
4 20/12/2017 00:00 arrive depart 2
4 . depart arrive 2
4 20/12/2017 00:00 arrive depart 3
4 . depart arrive 3
4 20/12/2017 00:00 arrive depart 4
4 . depart arrive 4
4 20/12/2017 00:00 arrive depart 5
4 . depart arrive 5
4 20/12/2017 00:00 arrive depart 6
4 . depart arrive 6
4 20/12/2017 00:00 arrive depart 7
4 . depart arrive 7
4 19/12/2017 00:00 arrive depart 8
4 . depart arrive 8
4 19/12/2017 00:00 arrive depart 9
4 . depart arrive 9
4 19/12/2017 00:00 arrive depart 10
4 . depart arrive 10
4 19/12/2017 00:00 arrive depart 11
4 . depart arrive 11
4 19/12/2017 00:00 arrive depart 12
4 . depart arrive 12
4 19/12/2017 00:00 arrive depart 32
4 . depart arrive 32
4 19/12/2017 00:00 arrive depart 32
4 . depart arrive 32
4 19/12/2017 00:00 arrive depart 32
4 . depart arrive 32
4 19/12/2017 00:00 arrive depart 32
4 19/12/2017 00:00 arrive arrive 32
269 26/01/2018 00:00 arrive none 1
269 07/02/2018 00:00 depart arrive 1
269 26/01/2018 00:00 arrive depart 2
269 07/02/2018 00:00 depart arrive 2
269 26/01/2018 00:00 arrive depart 3
269 07/02/2018 00:00 depart arrive 3
269 26/01/2018 00:00 arrive depart 4
269 07/02/2018 00:00 depart arrive 4
269 26/01/2018 00:00 arrive depart 5
269 07/02/2018 00:00 depart arrive 5
269 26/01/2018 00:00 arrive depart 6
269 07/02/2018 00:00 depart arrive 6
269 26/01/2018 00:00 arrive depart 7
269 07/02/2018 00:00 depart arrive 7
269 26/01/2018 00:00 arrive depart 8
269 07/02/2018 00:00 depart arrive 8
269 26/01/2018 00:00 arrive depart 9
269 07/02/2018 00:00 depart arrive 9
269 26/01/2018 00:00 arrive depart 10
269 07/02/2018 00:00 depart arrive 10
269 26/01/2018 00:00 arrive depart 11
269 07/02/2018 00:00 depart arrive 11
269 26/01/2018 00:00 arrive depart 12
269 07/02/2018 00:00 depart arrive 12
269 26/01/2018 00:00 arrive depart 44
269 07/02/2018 00:00 depart arrive 44
269 26/01/2018 00:00 arrive depart 44
269 07/02/2018 00:00 depart arrive 44
269 26/01/2018 00:00 arrive depart 44
269 07/02/2018 00:00 depart arrive 44
269 26/01/2018 00:00 arrive depart 44
269 07/02/2018 00:00 depart arrive 44
269 26/01/2018 00:00 arrive depart 44
269 07/02/2018 00:00 depart arrive 44
269 26/01/2018 00:00 arrive depart 44
269 07/02/2018 00:00 depart arrive 44
269 26/01/2018 00:00 arrive depart 44
269 07/02/2018 00:00 depart arrive 44
269 26/01/2018 00:00 arrive depart 44
269 07/02/2018 00:00 depart arrive 44
269 06/03/2018 00:00 arrive depart 44
269 18/03/2018 00:00 depart arrive 44
269 06/03/2018 00:00 arrive depart 44
269 18/03/2018 00:00 depart arrive 44
Изначально маршруты были на отдельных листах Excel, и я прочитал их на одном кадре данных ипочистил их немного.У большинства маршрутов есть даты начала, но остальные даты являются случайными и часто отсутствуют.
К счастью, у «регулярно текущих» маршрутов есть регулярный шаблон «item_type» и «dep»:
['item_type'] ['dep']
Прибытие отсутствует
Отправление Прибытие
Прибытие Отправление
Отправление Прибытие
Прибытие Отправление
...
['dep'] создан из .shift (1) of ['item_type']
proposals = df_sales[['cust_id', 'date', 'item','item_type']]
proposals = proposals[df_sales.item_type.str.contains("arrive|depart", na=False)]
proposals['dep'] = proposals.groupby('cust_id')['item_type'].shift(1).fillna('none')
proposals['proposal'] = proposals.groupby('cust_id')['dep'].transform(len)
Итак, у меня есть все эти условия, полезные для обозначения регулярных текущих маршрутов:
proposals['proposal'][(proposals['item_type']=="arrive")&(proposals['dep']=="none")] = 1
proposals['proposal'][
((proposals['item_type']=="depart")&(proposals['dep']=="arrive"))&
((proposals['item_type']=="arrive")&(proposals['dep']=="none")).shift(1)&
(proposals['proposal']==1).shift(1)]=1
proposals['proposal'][
((proposals['item_type']=="arrive")&(proposals['dep']=="none")).shift(2)&
((proposals['item_type']=="depart")&(proposals['dep']=="arrive")).shift(1)&
((proposals['item_type']=="arrive")&(proposals['dep']=="depart"))&
(proposals['proposal']==1).shift(1)]=2
proposals['proposal'][
((proposals['item_type']=="arrive")&(proposals['dep']=="none")).shift(3)&
((proposals['item_type']=="depart")&(proposals['dep']=="arrive")).shift(2)&
((proposals['item_type']=="arrive")&(proposals['dep']=="depart")).shift(1)&
(proposals['proposal']==2).shift(1)]=2
proposals['proposal'][
((proposals['item_type']=="arrive")&(proposals['dep']=="none")).shift(4)&
((proposals['item_type']=="depart")&(proposals['dep']=="arrive")).shift(3)&
((proposals['item_type']=="arrive")&(proposals['dep']=="depart")).shift(2)&
((proposals['item_type']=="depart")&(proposals['dep']=="arrive")).shift(1)&
((proposals['item_type']=="arrive")&(proposals['dep']=="depart"))&
(proposals['proposal']==2).shift(1)]=3
proposals['proposal'][...
Однако эти условия постоянно растут с ростом числа маршрутов.Я сделал до 12 «голыми руками», но хотел бы найти более питонический способ подняться 25,30,40 ...
Как я мог бы повторить эти рекурсивные условия .shift ()обозначить ['предложение'] для регулярных текущих маршрутов, встречающихся в шаблоне:?
['item_type'] ['dep'] ['предложение']
прибыть нет 1
Отправление Прибытие 1
Прибытие Отправление 2
Отправление Прибытие 2
Прибытие Отправление 3 ... и так далее ...