首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按条件向dataframe组广播值

按条件向dataframe组广播值
EN

Stack Overflow用户
提问于 2019-06-21 18:47:47
回答 4查看 545关注 0票数 3

Dataframe:

代码语言:javascript
复制
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。

代码语言:javascript
复制
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,但我不知道如何只广播级别最高的类别值。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-06-21 19:01:16

如果我正确理解,您可以通过字典映射来实现这一点:

代码语言:javascript
复制
df['CATEGORY_1'] = df.CLASS.map(pd.Series(df[df.GRADE == 'max']['CATEGORY'].values,index=df[df.GRADE == 'max']['CLASS']).to_dict())

输出:

代码语言:javascript
复制
         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
票数 4
EN

Stack Overflow用户

发布于 2019-06-21 19:13:53

因为你提到了groupby + transform

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

代码语言:javascript
复制
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)
票数 5
EN

Stack Overflow用户

发布于 2019-06-21 19:02:14

您可以首先选择列级别中值'max‘的行,然后在类上选择merge,例如:

代码语言:javascript
复制
df = df.merge( df[df.GRADE == 'max', ['CLASS','CATEGORY']], 
               on='CLASS, how='left',suffixes=('','_1'))
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56708924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档