我有一个数据框,该数据框以以下方式保存玩家的所有统计信息
player_id runs balls_faced strike_rate name match_date
4120 20 5 0.0 Aravind, S 2015-10-02
3788 10 10 0.0 Ashwin, R 2010-06-12
基于此数据框,我创建了另一个数据框,该数据框通过此代码进行汇总并计算某些统计信息
player_data = dataFrame.groupby('player_id').aggregate({'runs': [np.sum,np.min,np.max,np.mean],
'strike_rate':'mean',
'player_id' : 'count'
}).reset_index()
player_data.columns = player_data.columns.get_level_values(0)
player_data.columns = ['player_id','total_runs','min_run','max_run','average','strike_rate','total_matches']
player_data.sort_values(['total_runs','average','strike_rate'], ascending=False)
上面的代码为我提供了以下数据框
player_id total_runs min_run max_run average strike_rate total_matches
4120 108 0 21 3.857143 54.568571 28
3788 1177 0 77 20.293103 103.391207 58
我需要以下内容作为最终输出
Player_name player_id total_runs min_run max_run average strike_rate total_matches
Aravind, S 4120 108 0 21 3.857143 54.568571 28
Ashwin, R 3788 1177 0 77 20.293103 103.391207 58
但是由于分组原因,其他信息(例如玩家名称)丢失了。我需要保留这些信息。我已经尝试了一些操作,例如iloc或使用is_index = False进行groupby,但似乎无济于事。
我正在努力的最终解决方案是创建一个仅包含名称和ID的数据框,并从中删除重复的数据,然后将两个数据框合并到ID上,但我认为必须有一些更好或更有效的方法
答案 0 :(得分:1)
创建一个聚合函数:
f = dict.fromkeys(dataFrame, 'first')
f.update({'runs': [np.sum,np.min,np.max,np.mean],
'strike_rate':'mean',
'player_id' : 'count'
})
现在,将f
传递给player_data:
player_data = dataFrame.groupby('player_id').aggregate(f)
这里的想法是将您不想丢失的所有内容汇总为原始值组中的第一个值。
在“名称”的情况下,每个值都是相同的(又称玩家名称),因此在理论上仅取第一个值是有意义的。
另一种方法,如果只是要添加的“名称”列(什么都没有),则可以构建player_ids到“名称”的映射,然后手动将“名称”列添加到结果中。
mapping = dict(zip(dataFrame.player_id, dataFrame.name))
...
player_data['name'] = player_data['player_id'].map(mapping)