如何使用 python 数据帧在具有相同标识符的两行中查找值的比率

How to find ratio of values in two rows that have the same identifier using python dataframes

我有一个包含 4858 行和 67 列的数据框。这包含每个 MLB 球队本赛季每场比赛的统计数据。这意味着对于每场比赛,都有两行数据。一个是来自一支球队的数据,另一个是来自他们所在球队的数据。以下是列名称:['AB'、'R'、'H'、'RBI'、 'BB'、'SO'、'PA'、'BA'、'OBP'、'SLG'、'OPS'、'Pit'、'Str', 'RE24', 'WinOrLoss', 'Team', 'Opponent', 'HomeOrAway', 'url', 'Win_Percentage', 'R_Season_Long_Count', 'H_Season_Long_Count', 'BB_Season_Long_Count', 'SO_Season_Long_Count', 'PA_Season_Long_Count', 'R_Moving_Average_3', 'R_Moving_Average_10', 'R_Moving_Average_31', 'SLG_Moving_Average_3', 'SLG_Moving_Average_10', 'SLG_Moving_Average_31', 'BA_Moving_Average_3', 'BA_Moving_Average_10', 'BA_Moving_Average_31', 'OBP_Moving_Average_3', 'OBP_Moving_Average_10', 'OBP_Moving_Average_31', 'SO_Moving_Average_3', 'SO_Moving_Average_10', 'SO_Moving_Average_31', 'AB_Moving_Average_3', 'AB_Moving_Average_10', 'AB_Moving_Average_31', 'Pit_Moving_Average_3', 'Pit_Moving_Average_10', 'Pit_Moving_Average_31', 'H_Moving_Average_3', 'H_Moving_Average_10', 'H_Moving_Average_31', 'BB_Moving_Average_3', 'BB_Moving_Average_10', 'BB_Moving_Average_31', 'OPS_Moving_Average_3', 'OPS_Moving_Average_10', 'OPS_Moving_Average_31', 'RE24_Moving_Average_3', 'RE24_Moving_Average_10', 'RE24_Moving_Average_31', 'Win_Percentage_Moving_Average_3', 'Win_Percentage_Moving_Average_10', 'Win_Percentage_Moving_Average_31', 'BA_Season_Long_Average', 'SLG_Season_Long_Average', 'OPS_Season_Long_Average']

然后,这是这些列的输出图片。抱歉,它仅来自几列,但基本上所有统计数据都是这样的数字。

这个问题最重要的一栏是 url 栏。此列标识玩过的游戏,因为每款游戏只有一个唯一 url。但是,数据框中将有两行具有此唯一性 url,因为其中一行将包含该场比赛中一支球队的统计数据,另一行将包含该场比赛中另一支球队的统计数据。

现在,我想要做的是通过创建它们之间的比率来组合由公共 url 标识的这两行。因此,我想将第一支球队的统计数据除以第二支球队的统计数据,以获得具有独特 url 的特定游戏。我想为每个 game/unique url 执行此操作。我可以使用 groupby.sum() 函数对它们求和,但我不确定如何找到具有相同 url 的两行之间的比率。我真的很感激任何建议。非常感谢!

假设:

  • 总是每行 2 行 url
  • 在每个url中,2行中,你不关心哪个被哪个

你的数据集的一个小例子:

df = pd.DataFrame({
    'url': ['1', '1', '2', '2', '3', '3'],
    'non-stat1': np.arange(1., 7.),
    'non-stat2': np.arange(2., 8.),
    'stat1': np.arange(13., 19.),
    'stat2': np.arange(6., 12.),
})

这列出了您要应用除法的统计数据的列。

columns_for_ratio = ['stat1', 'stat2']

这就是部门的运作方式。 .values 给你一个总是有两行的数组,这样你就可以把数组解包成两个变量,每个变量一个数组。

def divide(two_rows):
    x, y = two_rows.values
    return pd.Series(x/y, two_rows.columns)

最后做除法

df.groupby('url')[columns_for_ratio].apply(divide)