我正在处理来自BoardGameGeek的棋盘游戏数据,我想创建一个数据框架,将棋盘游戏按最小玩家数量和类别进行分组。
以下是列名称:['name','category',' playtime','playtime_num','avg_rating','num_ratings','min_players'].
我首先基于“min_players”创建了一个名为“support_solo”的新列,用于指示棋盘游戏是否支持单人游戏:支持solo,不支持solo。
然后我创建了一个groupby对象:
grouped = popular.groupby(['support_solo', 'category'])
之后,我调用了基本的聚合函数,以获得每个类别中的游戏数量的细分,以及每个“solo/not solo组”中的游戏数量,以及其他字段(如游戏时间)的平均值。然而,我有麻烦得到的游戏与最多的收视率为每个类别。我使用了一个helper函数和一个所有groupby聚合的字典:
def game_with_highest_ratings(group):
max_ratings_index = group['num_ratings'].idxmax()
return group.loc[max_ratings_index, 'name']
aggregations = {
'name': 'count', # total number of games in each category
'num_ratings': game_with_highest_ratings, # game with the most ratings in each category
'avg_rating': 'mean', # average rating of games in each category
'playtime_num': 'mean', # average playtime of games in each category
}
grouped_result = grouped.agg(aggregations)
我继续得到KeyError:'num_ratings',我不知道如何解决这个问题。我已经检查了正确的列名。如何解决此问题,或者是否有其他方法?
1条答案
按热度按时间mwecs4sa1#
agg
只向函数传递一个Series,而不是完整的DataFrame。尝试在这里切片将在索引中搜索(group
已经是1D)。您无法访问其他列。最有效的解决方法可能是聚合
idxmax
并然后对其进行后处理。一个不那么干净的解决方案可能是在函数中使用硬编码的外部引用: