python仅对一个类别应用if语句和groupby

python仅对一个类别应用if语句和groupby,python,pandas,if-statement,group-by,Python,Pandas,If Statement,Group By,这个问题的背驮 我只想将以下规则应用于类型为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

这个问题的背驮

我只想将以下规则应用于类型为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
说明:

  • 类别A具有相同的代码,并且不是类型X->,因此没有标记T
  • 类别B有不同的代码,但不是类型X->所以没有标志T
  • 类别C只有一个代码,并且不是类型X->,因此没有标志T
  • 类别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,)
    

    逻辑和中缺少括号,这将导致错误分析条件中的操作顺序。除此之外,你的逻辑看起来应该有效

    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
    

    我可能读错了,但我认为这更直观(至少对我来说),不需要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
    

    df.loc[df['Type']='X','Test_flag']=.
    ?正确-一个类别为“D”,但两个不同的代码;A类代码相同,B类代码不同,但不是X类