首页 > 解决方案 > pandas - 根据不同数据框中的另一个值获取值

问题描述

我有数据框以下列方式保存玩家的所有统计数据

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 上的两个数据框,但我觉得必须有一些更好或更有效的方法来做到这一点。

标签: pythonpandaspandas-groupby

解决方案


创建一个聚合函数:

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)

这里的想法是将您不想丢失的所有内容汇总为具有原始值组中的第一个值。

在“姓名”的情况下,每个值都是相同的(AKA,玩家姓名),所以只取第一个值在理论上是有意义的。


另一种方法,如果它只是您想要添加的名称列(而不是其他),您可以构建 player_ids 到名称的映射,然后手动将您的名称列添加到结果中。

mapping = dict(zip(dataFrame.player_id, dataFrame.name))
...    
player_data['name'] = player_data['player_id'].map(mapping)

推荐阅读