按条件向数据帧组广播值

Kai*_*sar 3 python pandas

数据框:

STUD_ID   CLASS   GRADE  CATEGORY 
1         'Sci'    max  'Alpha' 
2         'Sci'    7    'Omega' 
3         'Sci'    9    'Alpha' 
4         'Sci'    3    'Alpha' 
5         'Sci'    9    'Alpha' 
7         'eng'    max  'Gamma' 
8         'eng'    5    'Gamma' 
9         'eng'    3    'Epsilon'
10        'Art'    3    'Lambda' 
11        'Art'    8    'Lambda' 
12        'Art'    max  undefined 
13        'Art'    1    undefined 
14        'Art'    5    undefined 
Run Code Online (Sandbox Code Playgroud)

我想创建一个新列 CATEGORY_1,将 CATEGORY 值(其中 GRADE 为最大值)广播到它们各自的 CLASS 组。请参阅下面的结果 df。

STUD_ID   CLASS   GRADE  CATEGORY CATEGORY_1
1         'Sci'    max  'Alpha' .   'Alpha'
2         'Sci'    7    'Omega' .   'Alpha'
3         'Sci'    9    'Alpha' .   'Alpha'
4         'Sci'    3    'Alpha' .   'Alpha'
5         'Sci'    9    'Alpha' .   'Alpha'
7         'eng'    max  'Gamma' .   'Gamma'
8         'eng'    5    'Gamma' .   'Gamma'
9         'eng'    3    'Epsilon'   'Gamma'
10        'Art'    3    'Lambda' .  undefined
11        'Art'    8    'Lambda' .  undefined
12        'Art'    max  undefined . undefined
13        'Art'    1    undefined . undefined
14        'Art'    5    undefined . undefined
Run Code Online (Sandbox Code Playgroud)

我试过使用 groupby + 变换,但我不知道如何只广播 GRADE 最大的 CATEGORY 值。

ALo*_*llz 5

因为你提到groupby+ transform

这很困难,因为您的转换依赖于不止一列。这需要您的转换函数接受系列和整个 DataFrame,然后您可以将其子集到组内(基于系列索引)。您应该有一个唯一的索引才能正常工作。

def get_max_cat(grade, df):
    s = grade=='max'
    return df.loc[s[s].index, 'CATEGORY'].item()  # Assumes always one max

df['Category_1'] = df.groupby('CLASS').GRADE.transform(get_max_cat, df=df)
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下,Andy L 的答案使使用 `first` 的 `transform` 变得容易:`df.CATEGORY.where(df.GRADE.eq('max')).groupby(df.CLASS).transform('首先')` (2认同)