计算熊猫中的重复块

时间:2016-07-29 07:14:53

标签: 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, 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

2 个答案:

答案 0 :(得分:2)

mask的解决方案:

On Error GoTo errorTrap

答案 1 :(得分:0)

这样做:

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

enter image description here