python - 使用 .groupby(...).agg(sum) 创建新的 Pandas.DataFrame 然后恢复未求和的列
问题描述
我从一个 baseabll 季节的数据框开始,其中一部分看起来与此类似:
Name Season AB H SB playerid
13047 A.J. Pierzynski 2013 503 137 1 746
6891 A.J. Pierzynski 2006 509 150 1 746
1374 Rod Carew 1977 616 239 23 1001942
1422 Stan Musial 1948 611 230 7 1009405
1507 Todd Helton 2000 580 216 5 432
1508 Nomar Garciaparra 2000 529 197 5 190
1509 Ichiro Suzuki 2004 704 262 36 1101
从这些赛季开始,我想创建一个职业统计数据框;也就是说,每个玩家的一行是他们的 AB、H 等的总和。这个数据框仍然应该包含玩家的名字。上面的 playerid 是每个玩家的唯一键,在创建职业统计数据框后,它应该是列中的索引或未更改的值。
我假设的出发点是df_careers = df_seasons.groupby('playerid').agg(sum)
,但这忽略了所有非数字数据。通过numeric_only = False
连接,我可以在诸如“Ichiro SuzukiIchiro SuzukiIchiro Suzuki”之类的名称列中得到某种混乱,但这只需要进行大量清理。这是我希望能够与其他数据集一起做的事情,而我拥有的实际数据更像是 25 列,所以我宁愿了解一个特定的例程来取回名称数据或从一开始就保留它如果可能的话,而不是编写一个特定的函数并使用groupby('playerid').agg(func)
(或类似的过程)来完成它。
我猜有一种相当简单的方法可以做到这一点,但我一周前才开始学习 Pandas,所以我的知识存在差距。
解决方案
如果“playerid”和“Name”之间存在一对一的关系,看起来就是这种情况,您可以在groupby
列中包含“Name”:
stat_cols = ['AB', 'H', 'SB']
groupby_cols = ['playerid', 'Name']
results = df.groupby(groupby_cols)[stat_cols].sum()
结果:
AB H SB
playerid Name
190 Nomar Garciaparra 529 197 5
432 Todd Helton 580 216 5
746 A.J. Pierzynski 1012 287 2
1101 Ichiro Suzuki 704 262 36
1001942 Rod Carew 616 239 23
1009405 Stan Musial 611 230 7
如果您希望仅按 'playerid' 分组并在之后添加 'Name' 数据,则可以创建一个 'playerId' 到 'Name' 映射作为字典,并使用以下命令查找它map
:
results = df.groupby('playerid')[stat_cols].sum()
name_map = pd.Series(df.Name.to_numpy(), df.playerid).to_dict()
results['Name'] = results.index.map(name_map)
结果:
AB H SB Name
playerid
190 529 197 5 Nomar Garciaparra
432 580 216 5 Todd Helton
746 1012 287 2 A.J. Pierzynski
1101 704 262 36 Ichiro Suzuki
1001942 616 239 23 Rod Carew
1009405 611 230 7 Stan Musial