2017-02-26 109 views
1

在下面的數據幀,每個值超過一個唯一行,我有三列:蟒蛇熊貓標誌,如果在

Code  | Category | Count 
    X    A   89734 
    X    A   239487 
    Y    B   298787 
    Z    B   87980 
    W    C   098454 

我需要添加一列,如果一個類有不止一個唯一代碼(如上例中的B),它會得到一個標誌,表示它是一個測試。

所以我要尋找的輸出是這樣的:

Code  | Category | Count | Test_Flag 
    X    A   89734  
    X    A   239487 
    Y    B   298787   T 
    Z    B   87980   T 
    W    C   098454 

回答

2

您也可以選擇transformnumpy.where填寫值。

df['Test_flag'] = np.where(df.groupby('Category').Code.transform('nunique') > 1, 'T', '') 


>>> df 
    Category Code Count Test_flag 
0  A X 89734   
1  A X 239487   
2  B Y 298787   T 
3  B Z 87980   T 
4  C W 98454   
2

您可以使用filtrationnunique尋找index values,然後創建新列與loc

print (df.groupby('Category').Code.filter(lambda x: x.nunique() > 1)) 
2 Y 
3 Z 
Name: Code, dtype: object 

idx = df.groupby('Category').Code.filter(lambda x: x.nunique() > 1).index 
print (idx) 
Int64Index([2, 3], dtype='int64') 

df.loc[idx, 'Test_Flag'] = 'T' 
#if necessary, replace NaN to empty string 
#df.Test_Flag = df.Test_Flag.fillna('') 

print (df) 
    Code Category Count Test_Flag 
0 X  A 89734  NaN 
1 X  A 239487  NaN 
2 Y  B 298787   T 
3 Z  B 87980   T 
4 W  C 98454  NaN 

另一種解決方案與transform爲用於loc的布爾掩碼:

print (df.groupby('Category').Code.transform('nunique')) 
0 1 
1 1 
2 2 
3 2 
4 1 
Name: Code, dtype: int64 

mask = df.groupby('Category').Code.transform('nunique') > 1 
print (mask) 
0 False 
1 False 
2  True 
3  True 
4 False 
Name: Code, dtype: bool 

df.loc[mask, 'Test_Flag'] = 'T' 
#if necessary, replace NaN to empty string 
#df.Test_Flag = df.Test_Flag.fillna('') 

print (df) 
    Code Category Count Test_Flag 
0 X  A 89734  NaN 
1 X  A 239487  NaN 
2 Y  B 298787   T 
3 Z  B 87980   T 
4 W  C 98454  NaN