Dataframe:
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 我想要创建一个新的列CATEGORY_1,它将类别值(其中的等级为最高)广播到各自的类组。见下面的结果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我尝试过使用groupby + transform,但我不知道如何只广播级别最高的类别值。
发布于 2019-06-21 19:01:16
如果我正确理解,您可以通过字典映射来实现这一点:
df['CATEGORY_1'] = df.CLASS.map(pd.Series(df[df.GRADE == 'max']['CATEGORY'].values,index=df[df.GRADE == 'max']['CLASS']).to_dict())输出:
CLASS GRADE CATEGORY CATEGORY_1
STUD_ID
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发布于 2019-06-21 19:13:53
因为你提到了groupby + transform
这很困难,因为转换依赖于多个列。这需要您的转换函数同时接受Series和整个DataFrame,然后您可以将其子集到组内(基于Series索引)。您应该有一个唯一的索引来使其正常工作。
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)发布于 2019-06-21 19:02:14
您可以首先选择列级别中值'max‘的行,然后在类上选择merge,例如:
df = df.merge( df[df.GRADE == 'max', ['CLASS','CATEGORY']],
on='CLASS, how='left',suffixes=('','_1'))https://stackoverflow.com/questions/56708924
复制相似问题