groupby / shift для создания метки для отдельных маршрутов из большого набора данных - PullRequest
0 голосов
/ 19 июня 2019

Первый раз отправляю 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 ... и так далее ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...