2017-03-08 58 views
2

我有一個帶有兩個組指標cat1和cat2的數據框。我想在cat1中標記cat2的第一次出現。在Pandas組中標記第一類

我有什麼:

df = pd.DataFrame([['a','x'],['a','x'],['a','y'],['a','y'],['b','y'],['b','z'],['c','z']], columns = ['cat1', 'cat2']) 

    cat1 cat2 
0 a x 
1 a x 
2 a y 
3 a y 
4 b y 
5 b z 
6 c z 

我想什麼來獲得:

cat1 cat2 flag 
0 a x 1 
1 a x 1 
2 a y 0 
3 a y 0 
4 b y 1 
5 b z 0 
6 c z 1 

我曾嘗試以組滾動計數的各種版本,但無法獲得期望的結果。

謝謝!!!

回答

2

你可以groupby上「CAT1」,然後調用transform其應用於一個lambda那CAT2'的值對第一值進行比較,這將使用astype產生一個布爾數組,我們就可以轉換爲int

In [166]: 
df['flag'] = df.groupby('cat1')['cat2'].transform(lambda x: x== x.iloc[0]).astype(int) 
df 

Out[166]: 
    cat1 cat2 flag 
0 a x  1 
1 a x  1 
2 a y  0 
3 a y  0 
4 b y  1 
5 b z  0 
6 c z  1 

在這裏你可以看到布爾輸出:

In [167]: 
df.groupby('cat1')['cat2'].transform(lambda x: x== x.iloc[0]) 

Out[167]: 
0  True 
1  True 
2 False 
3 False 
4  True 
5 False 
6  True 
Name: cat2, dtype: object 

另一種方法是調用first的比較:

In [169]: 
df['flag'] = (df['cat2'] == df.groupby('cat1')['cat2'].transform('first')).astype(int) 
df 

Out[169]: 
    cat1 cat2 flag 
0 a x  1 
1 a x  1 
2 a y  0 
3 a y  0 
4 b y  1 
5 b z  0 
6 c z  1 
+0

非常感謝! – Robert

相關問題