python - 计算 Pandas 中的重复 block

标签 python pandas dataframe nan cumsum

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

最佳答案

解决方案 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

关于python - 计算 Pandas 中的重复 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38652683/

相关文章:

python - Python中的OpenCV2使用inRange抛出错误

python - pandas read_csv 修复列以读取数据中带有换行符的数据

python - 如何根据 dfB 中的列/行值,使用另一个数据帧 (dfB) 中的值填充 pandas 数据帧 (dfA) 列 "A"?

Python Pretty Table 输出到文本文件

python - 多次运行 Celery/Django 单个任务

python - 将训练数据的四分位数切割应用于测试数据

python - 如何在最后一次出现值后删除所有行?

R:对分组变量的每个成对组合进行 t 检验,对 ID 变量中的每个元素进行

pandas - '<' not supported between instances of ' 日期时间.日期' 和 'str'

python - for语句在Python中循环字典