如何在Pandas中对Kickstarter数据集实现分组后的主次排序?
解决Kickstarter数据集类别排序问题
我来帮你搞定这个排序需求!你想要的是先按每个主类别的总项目数进行主排序(也就是不管状态,哪个类别整体最受欢迎排前面),然后在同一个类别下,再按每个状态的项目数进行二次排序对吧?
你原来的代码ks.groupby(['main_category','state']).count().sort_values('name', ascending=False)只是对每个(主类别+状态)的组合计数单独排序,没有考虑类别整体的总数量,所以才会不符合预期。下面是具体的实现步骤:
步骤1:计算每个主类别的总项目数
首先我们需要先算出每个main_category的总项目数,作为后续排序的主依据:
import pandas as pd # 计算每个主类别的总项目数,并重命名列名为total_count total_category_counts = ks.groupby('main_category')['name'].count().rename('total_count')
步骤2:按类别+状态分组并合并总计数
接下来我们按main_category和state分组统计每个组合的项目数,然后把刚才算的总计数合并进来:
# 按类别+状态分组统计,重命名列名为state_count并转为DataFrame grouped_data = ks.groupby(['main_category', 'state'])['name'].count().rename('state_count').reset_index() # 合并总计数列 grouped_data = grouped_data.merge(total_category_counts, on='main_category')
步骤3:按需求排序
现在我们就可以按照「总计数降序 → 状态计数降序」的规则排序了。如果还想指定状态的优先级(比如你关心的successful→failed→cancelled顺序),可以把state转为分类类型:
# 可选:指定状态的排序优先级,让successful排在最前面 grouped_data['state'] = pd.Categorical( grouped_data['state'], categories=['successful', 'failed', 'cancelled'], ordered=True ) # 执行排序:先按total_count降序,再按state_count降序,最后按指定的state顺序 sorted_result = grouped_data.sort_values( by=['total_count', 'state_count', 'state'], ascending=[False, False, True] ) # 查看结果 print(sorted_result.head(10))
如果不需要指定状态的固定顺序,直接按状态计数降序即可:
sorted_result = grouped_data.sort_values( by=['total_count', 'state_count'], ascending=[False, False] )
这样得到的结果就会先把整体项目最多的主类别排在前面,同一个类别下,项目数多的状态会更靠前,完全符合你的需求!
内容的提问来源于stack exchange,提问作者dr jerry
相关产品推荐
相关产品推荐

