熊猫-根据不同数据框中的另一个值获取价值

时间:2018-07-09 14:31:23

标签: python pandas pandas-groupby

我有一个数据框,该数据框以以下方式保存玩家的所有统计信息

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上,但我认为必须有一些更好或更有效的方法

1 个答案:

答案 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)