Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pandas 为每个同级组分配适当的同级周期计数_Pandas_Numpy - Fatal编程技术网

Pandas 为每个同级组分配适当的同级周期计数

Pandas 为每个同级组分配适当的同级周期计数,pandas,numpy,Pandas,Numpy,我试图为每个队列组的“队列周期”列分配适当的队列周期计数。我相信,展示我正在努力实现的目标更有意义 因为循环似乎是一种方式,我想知道是否可以使用一些漂亮的函数实现同样的功能 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

我试图为每个队列组的“队列周期”列分配适当的队列周期计数。我相信,展示我正在努力实现的目标更有意义

因为循环似乎是一种方式,我想知道是否可以使用一些漂亮的函数实现同样的功能

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
如果队列组和OrderPeriod相同,则为其分配1,然后计算每个新的OrderPeriod并将该数字分配给队列期间。一旦一个新的同居群体开始,这个过程又开始了

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

首先,我们让您的
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

我会做
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

为什么第11行和第12行的
队列期
相同?第18行有点不一致我之所以设置
变量是:如果
队列组
以后再次更改为
2017-01-01