如何使用 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)
我有一个包含 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)