Для каждой группы CohortGroup назначьте правильный счетчик CohortPeriod - PullRequest
2 голосов
/ 31 октября 2019

Я пытаюсь присвоить правильное количество периодов когорты столбцу «Период когорты» для каждой группы когорт. Я считаю, что показ того, чего я пытаюсь достичь, имеет больше смысла.

Поскольку циклы кажутся верным, было интересно, можно ли добиться того же с помощью некоторой изящной функции панд.

Out[7]: 
   OrderPeriod CohortGroup  Cohort Period
0     1/1/2017    1/1/2017            NaN
1     1/1/2017    1/1/2017            NaN
2     1/1/2017    1/1/2017            NaN
3     1/1/2017    1/1/2017            NaN
4     1/1/2017    1/1/2017            NaN
5     1/1/2017    1/1/2017            NaN
6     1/1/2017    1/1/2017            NaN
7     1/1/2017    1/1/2017            NaN
8     4/1/2017    1/1/2017            NaN
9     6/1/2017    1/1/2017            NaN
10    8/1/2017    1/1/2017            NaN
11    9/1/2017    1/1/2017            NaN
12    9/1/2017    1/1/2017            NaN
13   11/1/2017    1/1/2017            NaN
14    4/1/2018    1/1/2017            NaN
15    6/1/2018    1/1/2017            NaN
16   12/1/2018    1/1/2017            NaN
17    1/1/2019    1/1/2017            NaN
18    5/1/2019    1/1/2017            NaN
19    2/1/2017    2/1/2017            NaN
20    3/1/2017    3/1/2017            NaN
21    3/1/2017    3/1/2017            NaN
22    3/1/2017    3/1/2017            NaN
23    3/1/2017    3/1/2017            NaN
24    3/1/2017    3/1/2017            NaN
25    4/1/2017    3/1/2017            NaN

Если Cohort Group и OrderPeriod одинаковы, то им присваивается 1, затем подсчитывает для каждого нового OrderPeriod и присваивает это число периоду когорты. После запуска новой CohortGroup процесс начинается снова.

Out[7]: 
   OrderPeriod CohortGroup  Cohort Period
0     1/1/2017    1/1/2017            1.0
1     1/1/2017    1/1/2017            1.0
2     1/1/2017    1/1/2017            1.0
3     1/1/2017    1/1/2017            1.0
4     1/1/2017    1/1/2017            1.0
5     1/1/2017    1/1/2017            1.0
6     1/1/2017    1/1/2017            1.0
7     1/1/2017    1/1/2017            1.0
8     4/1/2017    1/1/2017            2.0
9     6/1/2017    1/1/2017            3.0
10    8/1/2017    1/1/2017            4.0
11    9/1/2017    1/1/2017            5.0
12    9/1/2017    1/1/2017            5.0
13   11/1/2017    1/1/2017            6.0
14    4/1/2018    1/1/2017            7.0
15    6/1/2018    1/1/2017            8.0
16   12/1/2018    1/1/2017            9.0
17    1/1/2019    1/1/2017           10.0
18    5/1/2019    1/1/2017           11.0
19    2/1/2017    2/1/2017            1.0
20    3/1/2017    3/1/2017            1.0
21    3/1/2017    3/1/2017            1.0
22    3/1/2017    3/1/2017            1.0
23    3/1/2017    3/1/2017            1.0
24    3/1/2017    3/1/2017            1.0
25    4/1/2017    3/1/2017            2.0

Ответы [ 2 ]

2 голосов
/ 31 октября 2019

Я сделаю rank

df=df.apply(pd.to_datetime)

df['Cohort Period']=df.groupby('CohortGroup')['OrderPeriod'].rank('dense')
df
   OrderPeriod CohortGroup  Cohort Period
0   2017-01-01  2017-01-01            1.0
1   2017-01-01  2017-01-01            1.0
2   2017-01-01  2017-01-01            1.0
3   2017-01-01  2017-01-01            1.0
4   2017-01-01  2017-01-01            1.0
5   2017-01-01  2017-01-01            1.0
6   2017-01-01  2017-01-01            1.0
7   2017-01-01  2017-01-01            1.0
8   2017-04-01  2017-01-01            2.0
9   2017-06-01  2017-01-01            3.0
10  2017-08-01  2017-01-01            4.0
11  2017-09-01  2017-01-01            5.0
12  2017-09-01  2017-01-01            5.0
13  2017-11-01  2017-01-01            6.0
14  2018-04-01  2017-01-01            7.0
15  2018-06-01  2017-01-01            8.0
16  2018-12-01  2017-01-01            9.0
17  2019-01-01  2017-01-01           10.0
18  2019-05-01  2017-01-01           11.0
19  2017-02-01  2017-02-01            1.0
20  2017-03-01  2017-03-01            1.0
21  2017-03-01  2017-03-01            1.0
22  2017-03-01  2017-03-01            1.0
23  2017-03-01  2017-03-01            1.0
24  2017-03-01  2017-03-01            1.0
25  2017-04-01  2017-03-01            2.0
2 голосов
/ 31 октября 2019

Сначала мы заставляем ваши CohortGroup группы проверять, где это меняется, с shift

Затем мы используем groupby.apply, чтобы проверить, где OrderPeriod не совпадает с CohortGroup:

groups = df['CohortGroup'].ne(df['CohortGroup'].shift()).cumsum()

cohort_period = df.groupby(groups)\
                  .apply(lambda x: (x['OrderPeriod'].ne(x['CohortGroup'])\
                                    & x['OrderPeriod'].ne(x['OrderPeriod'].shift(-1)))\
                         .cumsum().add(1)).values

df['Cohort Period'] = cohort_period

выход

   OrderPeriod CohortGroup  Cohort Period
0     1/1/2017    1/1/2017              1
1     1/1/2017    1/1/2017              1
2     1/1/2017    1/1/2017              1
3     1/1/2017    1/1/2017              1
4     1/1/2017    1/1/2017              1
5     1/1/2017    1/1/2017              1
6     1/1/2017    1/1/2017              1
7     1/1/2017    1/1/2017              1
8     4/1/2017    1/1/2017              2
9     6/1/2017    1/1/2017              3
10    8/1/2017    1/1/2017              4
11    9/1/2017    1/1/2017              4
12    9/1/2017    1/1/2017              5
13   11/1/2017    1/1/2017              6
14    4/1/2018    1/1/2017              7
15    6/1/2018    1/1/2017              8
16   12/1/2018    1/1/2017              9
17    1/1/2019    1/1/2017             10
18    5/1/2019    1/1/2017             11
19    2/1/2017    2/1/2017              1
20    3/1/2017    3/1/2017              1
21    3/1/2017    3/1/2017              1
22    3/1/2017    3/1/2017              1
23    3/1/2017    3/1/2017              1
24    3/1/2017    3/1/2017              1
25    4/1/2017    3/1/2017              2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...