【问题标题】:Counting repeated blocks in pandas计算熊猫中的重复块
【发布时间】:2016-07-29 07:14:52
【问题描述】:

我有以下数据框,我试图用一个数字标记整个块,该数字基于到目前为止基于类列看到的类似块的数量。连续的类值被赋予相同的数字。如果稍后出现相同的类块,则该数字将增加。如果有新的类块出现,则将其初始化为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

【问题讨论】:

    标签: python pandas dataframe nan cumsum


    【解决方案1】:

    mask 的解决方案:

    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
    

    【讨论】:

    • 谢谢。但是最后一个块应该以 1 开头,因为 b 块是新类。
    • 对不起。现在我编辑答案 - 通过Class 添加 groupby,以便可以更正解决方案。
    【解决方案2】:

    这样做:

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

    【讨论】:

    • 谢谢。但最后一个块应该以 1 开头,因为 b 块是新类。
    猜你喜欢
    • 2019-10-14
    • 1970-01-01
    • 2017-05-10
    • 1970-01-01
    • 2021-12-13
    • 2018-10-29
    • 1970-01-01
    • 2020-04-18
    • 2018-03-19
    相关资源
    最近更新 更多