首页 > 解决方案 > 使用 Pandas 进行分组时按条件选择值

问题描述

我的示例df如下所示:

sid    score   completed
101      70      NaN
102      56      Yes
101      65      No
103      88      Yes  
103      50      NaN  
102      42      No  
105      79      NaN  
....

我想要什么?

我的决赛df应该是这样的:

sid    score_max   completed
101       70           No
102       56           Yes
103       88           Yes  
105       79           NaN  
....

我做了什么?

df_groupby = df.groupby(['sid']).agg(
    score_max = ('score','max'),
    completed = ('completed', any(completed="Yes"))
)

但是,该解决方案不起作用。你能帮我解决这个问题吗?

标签: pythonpandas

解决方案


使用有序pd.CategoricalDtype解决您的问题:

>>> df.astype({'completed': pd.CategoricalDtype(['No', 'Yes'], ordered=True)}) \
      .groupby('sid') \
      .agg(score_max=('score', 'max'), completed=('completed', 'max')) \
      .reset_index()

   sid  score_max completed
0  101         70        No
1  102         56       Yes
2  103         88       Yes
3  105         79       NaN

关于类别的详细信息:

df1 = pd.DataFrame({'Col1': ['No', 'Yes', np.NaN]})
df1['Col1'] = df1['Col1'].astype(pd.CategoricalDtype(['No', 'Yes'], 
                                                     ordered=True))
>>> df1['Col1'].min()
'No'

>>> df1['Col1'].max()
'Yes'

推荐阅读