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