gpt4 book ai didi

python - Pandas - 多条件查找速度

转载 作者:行者123 更新时间:2023-12-01 01:09:55 28 4
gpt4 key购买 nike

我正在处理一些棒球历史数据,并尝试获取之前比赛的比赛信息(击球手/投手)。

示例数据:

import pandas as pd

data = {'ID': ['A','A','A','A','A','A','B','B','B','B','B'],
'Year' : ['2017-05-01', '2017-06-03', '2017-08-02', '2018-05-30', '2018-07-23', '2018-09-14', '2017-06-01', '2017-08-03', '2018-05-15', '2018-07-23', '2017-05-01'],
'ID2' : [1,2,3,2,2,1,2,2,2,1,1],
'Score 2': [1,4,5,7,5,5,6,1,4,5,6],
'Score 3': [1,4,5,7,5,5,6,1,4,5,6],
'Score 4': [1,4,5,7,5,5,6,1,4,5,6]}
df = pd.DataFrame(data)

lookup_data = {"First_Person" : ['A', 'B'],
"Second_Person" : ['1', '2'],
"Year" : ['2018', '2018']}

lookup_df = pd.DataFrame(lookup_data)

查找df有当前对局,df有历史数据和当前对局。

例如,我想查找 A 与 2 之间的比赛,他们在之前任意日期的任何一场比赛的结果是什么?

我可以通过以下方式做到这一点:

history_list = []
def get_history(row, df, hist_list):
#we filter the df to matchups containing both players before the previous date and sum all events in their history
history = df[(df['ID'] == row['First_Person']) & (df['ID2'] == row['Second_Person']) & (df['Year'] < row['Year'])].sum().iloc[3:]
#add to a list to keep track of results
hist_list.append(list(history.values) + [row['Year']+row['First_Person']+row['Second_Person']])

然后像这样使用 apply 执行:

lookup_df.apply(get_history, df=df, hist_list = history_list, axis=1)

预期结果类似于:

1st P  Matchup date 2nd p   Historical scores
A 2018-07-23 2 11 11 11
B 2018-05-15 2 7 7 7

但这非常慢 - 每次查找过滤操作大约需要 50 毫秒。

有更好的方法可以解决这个问题吗?目前,运行 25 万场历史比赛需要 3 个多小时。

最佳答案

您可以合并或映射和分组,

lookup_df['Second_Person'] =   lookup_df['Second_Person'].astype(int) 

merged = df.merge(lookup_df, left_on = ['ID', 'ID2'], right_on = ['First_Person', 'Second_Person'], how = 'left').query('Year_x < Year_y').drop(['Year_x', 'First_Person', 'Second_Person', 'Year_y'], axis = 1)

merged.groupby('ID', as_index = False).sum()

ID ID2 Score 2 Score 3 Score 4
0 A 1 1 1 1
1 B 4 7 7 7

关于python - Pandas - 多条件查找速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54960609/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com