2017-02-27 47 views
2
這個問題 python pandas flag if more than one unique row per value in column

蟒蛇大熊貓適用if語句和GROUPBY只爲一個類別

我想下面的規則只適用於行與X類型

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

數據幀DF的

捎帶:

Code  | Type | Category | Count 
    code1   Y  A   89734 
    code1   Y  A   239487 
    code2   Z  B   298787 
    code3   Z  B   87980 
    code4   Y  C   098454 
    code5   X  D   298787 
    code6   X  D   87980 

預期結果:

Code  | Type | Category | Count | Test Flag 
    code1   Y  A   89734 
    code1   Y  A   239487 
    code2   Z  B   298787 
    code3   Z  B   87980 
    code4   Y  C   098454 
    code5   X  D   298787  T 
    code6   X  D   87980  T 

說明:

  1. A類具有相同的代碼,並且不鍵入X - >所以沒有標記T的值
  2. B類有不同的碼,但不爲類型X - >所以沒有標記T的值
  3. C類只有一個代碼,並且不鍵入X - >所以沒有標記T的值
  4. 類別d具有不同的代碼和爲類型X - >標記T的值

我噸裏德本

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

,我得到以下錯誤:

ValueError: operands could not be broadcast together with shapes (1,2199) (7620,) 
+1

'df.loc [df ['Type'] =='X','Test_flag'] = ...'? – Jakub

+0

正確 - 一個類別「D」,但兩個不同的代碼;而類別A具有相同的代碼,類別B具有不同的代碼,但不是類型X – jeangelj

回答

1

你缺少括號中的邏輯,和這將導致在條件操作的順序來解析不正確。除此之外,你的邏輯看起來應該起作用。

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

最小演示

>>> df 
    Category Code Count Type 
0  A code1  1 Y 
1  A code1  2 Y 
2  B code2  3 Z 
3  B code3  4 Z 
4  C code4  5 Y 
5  D code5  4 X 
6  D code6  2 X 

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

>>> df 
    Category Code Count Type Test_flag 
0  A code1  1 Y   
1  A code1  2 Y   
2  B code2  3 Z   
3  B code3  4 Z   
4  C code4  5 Y   
5  D code5  4 X   T 
6  D code6  2 X   T 
+1

謝謝(如此接近!) – jeangelj

1

我可能讀這個錯誤,但我(至少我)認爲這是一個更直觀一點,而且不需要numpy的:

df['Test Flag'] = '' 
df['Test Flag'][(~df['Code'].duplicated()) & (df['Type'] == 'X')] = 'T' 

結果:

Code Type Category Count Test Flag 
0 code1 Y  A 89734   
1 code1 Y  A 239487   
2 code2 Z  B 298787   
3 code3 Z  B 87980   
4 code4 Y  C 098454   
5 code5 X  D 298787   T 
6 code6 X  D 87980   T