Python 大熊猫重复块的计数

Python 大熊猫重复块的计数,python,pandas,dataframe,nan,cumsum,Python,Pandas,Dataframe,Nan,Cumsum,我有下面的数据框,我试图用一个数字来标记一个完整的块,这个数字基于到目前为止已经看到的基于类列的类似块的数量。连续类值被赋予相同的编号。如果相同的类块稍后出现,则该数字将递增。如果出现某个新的类块,则将其初始化为1 df = DataFrame(zip(range(10,30), range(20)), columns = ['a','b']) df['Class'] = [np.nan, np.nan, np.nan, np.nan, 'a', 'a', 'a', 'a', np.nan, n

我有下面的数据框,我试图用一个数字来标记一个完整的块,这个数字基于到目前为止已经看到的基于类列的类似块的数量。连续类值被赋予相同的编号。如果相同的类块稍后出现,则该数字将递增。如果出现某个新的类块,则将其初始化为
1

df = DataFrame(zip(range(10,30), range(20)), columns = ['a','b'])
df['Class'] = [np.nan, np.nan, np.nan, np.nan, 'a', 'a', 'a', 'a', np.nan, np.nan,'a',  'a',  'a', 'a', 'a', np.nan, np.nan, 'b', 'b','b']

     a   b Class
0   10   0   NaN
1   11   1   NaN
2   12   2   NaN
3   13   3   NaN
4   14   4     a
5   15   5     a
6   16   6     a
7   17   7     a
8   18   8   NaN
9   19   9   NaN
10  20  10     a
11  21  11     a
12  22  12     a
13  23  13     a
14  24  14     a
15  25  15   NaN
16  26  16   NaN
17  27  17     b
18  28  18     b
19  29  19     b
示例输出如下所示:

    a   b   Class   block_encounter_no
0   10  0   NaN NaN
1   11  1   NaN NaN
2   12  2   NaN NaN
3   13  3   NaN NaN
4   14  4   a   1
5   15  5   a   1
6   16  6   a   1
7   17  7   a   1
8   18  8   NaN NaN
9   19  9   NaN NaN
10  20  10  a   2
11  21  11  a   2
12  22  12  a   2
13  23  13  a   2
14  24  14  a   2
15  25  15  NaN NaN
16  26  16  NaN NaN
17  27  17  b   1
18  28  18  b   1
19  29  19  b   1
这样做:

df['block_encounter_no'] = \
    np.where(df.Class.notnull(),
             (df.Class.notnull() & (df.Class != df.Class.shift())).cumsum(),
             np.nan)

解决方案包括:


谢谢但是最后一个块应该以1开头,因为
b
块是新类。谢谢。但是最后一个块应该以1开头,因为
b
块是新类。对不起。现在我编辑答案-添加groupby
,这样解决方案就可以更正了。
df['block_encounter_no'] = (df.Class != df.Class.shift()).mask(df.Class.isnull())
                              .groupby(df.Class).cumsum()
print (df)
     a   b Class  block_encounter_no
0   10   0   NaN                 NaN
1   11   1   NaN                 NaN
2   12   2   NaN                 NaN
3   13   3   NaN                 NaN
4   14   4     a                 1.0
5   15   5     a                 1.0
6   16   6     a                 1.0
7   17   7     a                 1.0
8   18   8   NaN                 NaN
9   19   9   NaN                 NaN
10  20  10     a                 2.0
11  21  11     a                 2.0
12  22  12     a                 2.0
13  23  13     a                 2.0
14  24  14     a                 2.0
15  25  15   NaN                 NaN
16  26  16   NaN                 NaN
17  27  17     b                 1.0
18  28  18     b                 1.0
19  29  19     b                 1.0