2016-07-29 114 views
2

我有下面的數據幀,我試圖用一個數字來標記整個塊,這個數字是基於類列中到目前爲止已經看到了多少個類似的塊。連續的類別值賦予相同的編號。如果稍後出現相同的等級塊,則數字將遞增。如果出現了一些新的等級塊,則將其初始化爲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

解決方案與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 
+0

謝謝。但是最後的塊應該以1開始,因爲'b'塊是新類。 – learner

+0

對不起。現在我編輯答案 - 通過'Class'添加groupby,所以解決方案可以被糾正。 – jezrael

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

+0

謝謝。但是最後的塊應該以1開始,因爲'b'塊是新類。 – learner