首页 > 解决方案 > 使用 .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,所以我的知识存在差距。

标签: pythonpandas

解决方案


如果“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

推荐阅读