首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Pandas -多条件查找速度

Pandas -多条件查找速度
EN

Stack Overflow用户
提问于 2019-03-03 00:32:42
回答 1查看 148关注 0票数 1

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

示例数据:

代码语言:javascript
运行
复制
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,他们在之前的任何日期的任何比赛的结果是什么?

我可以使用以下命令来实现:

代码语言:javascript
运行
复制
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执行,如下所示:

代码语言:javascript
运行
复制
lookup_df.apply(get_history, df=df, hist_list = history_list, axis=1)

预期结果如下所示:

代码语言:javascript
运行
复制
1st P  Matchup date 2nd p   Historical scores
A      2018-07-23     2     11 11 11
B      2018-05-15     2     7  7  7

但这是相当慢的-过滤操作需要大约50ms的每次查找。

有没有更好的方法来解决这个问题?目前,这将需要超过3个小时来运行超过25万个历史匹配。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-03 00:57:04

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

代码语言:javascript
运行
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54960609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档