为了账号安全,请及时绑定邮箱和手机立即绑定

df.iterrows()的替代方案,用于连接两个Postgres表和计算功能

df.iterrows()的替代方案,用于连接两个Postgres表和计算功能

慕少森 2021-04-28 18:45:55
我有一个数据框(game_df)和一个Postgres表(team_stats_1970_2017)。game_df 由几千行包含这样的数据...      season_yr home_team visitor_team  home_team_runs  visitor_team_runs0         2017       ARI          SFG               6                  51         2017       ARI          SFG               4                  82         2017       ARI          SFG               8                  63         2017       ARI          SFG               9                  34         2017       ARI          CLE               7                  35         2017       ARI          CLE              11                  26         2017       ATL          LAD               2                  3team_stats_1970_2017 会有这个对应的数据   team season_yr  r_per_g pa      ab    b_r  b_h   b2   b3   b_hr0  ARI      2017     5.01  6224.0  5525  812  1405  314  39   220  1  ATL      2017     4.52  6216.0  5584  732  1467  289  26   165       2  CLE      2017     5.05  6234.0  5511  818  1449  333  29   212       3  LAD      2017     4.75  6191.0  5408  770  1347  312  20   221       4  SFG      2017     3.94  6137.0  5551  639  1382  290  28   128   例如,对于的第1行game_df,代码从team_stats_1970_2017Postgres中选择“ ARI”和“ SFG”数据,并由此创建特征。然后,对其中的其余行重复此操作game_df。我目前正在使用df.iterrows,但是我注意到它的速度很慢,因为我仅测试了我的一小部分数据,并且仍然需要一段时间。有人会为此提供更好/更快的替代方法吗?features = []results = []for index,row in game_df.iterrows():        import psycopg2 as pg2        connect = pg2.connect(login)        cursor=connect.cursor()        year, t1, t2, p1, p2 = row        p1, p2 = map(int, [p1, p2])         feature1 = cursor.execute("SELECT * FROM team_stats_1970_2017 WHERE team = (%s) and season_yr = (%s)",(t1,year))        feature1 = list(cursor.fetchone()[2::])        feature2 = cursor.execute("SELECT * FROM team_stats_1970_2017 WHERE team = (%s) and season_yr = (%s)",(t2,year))        feature2 = list(cursor.fetchone()[2::])        feature = np.array(feature2) - np.array(feature1)
查看完整描述

2 回答

?
芜湖不芜

TA贡献1796条经验 获得超7个赞

如果我理解正确,如果可以将其team_stats_1970_2017作为pandas数据框,则可以应用2个合并:一个在home_team和上season_yr,一个在visitor_team和上season_yr:


merged_df = (game_df.merge(team_stats_1970_2017,

                           left_on=['home_team', 'season_yr'],

                           right_on=['team', 'season_yr'])

             .merge(team_stats_1970_2017, left_on=['visitor_team', 'season_yr'],

                    right_on=['team', 'season_yr'],

                    suffixes=['_home', '_visitor'])

             .drop(['team_visitor', 'team_home'], axis=1))


>>> merged_df

   season_yr home_team visitor_team  home_team_runs  visitor_team_runs  \

0       2017       ARI          SFG               6                  5   

1       2017       ARI          SFG               4                  8   

2       2017       ARI          SFG               8                  6   

3       2017       ARI          SFG               9                  3   

4       2017       ARI          CLE               7                  3   

5       2017       ARI          CLE              11                  2   

6       2017       ATL          LAD               2                  3   


   r_per_g_home  pa_home  ab_home  b_r_home  b_h_home      ...       b3_home  \

0          5.01   6224.0     5525       812      1405      ...            39   

1          5.01   6224.0     5525       812      1405      ...            39   

2          5.01   6224.0     5525       812      1405      ...            39   

3          5.01   6224.0     5525       812      1405      ...            39   

4          5.01   6224.0     5525       812      1405      ...            39   

5          5.01   6224.0     5525       812      1405      ...            39   

6          4.52   6216.0     5584       732      1467      ...            26   


   b_hr_home  r_per_g_visitor  pa_visitor  ab_visitor  b_r_visitor  \

0        220             3.94      6137.0        5551          639   

1        220             3.94      6137.0        5551          639   

2        220             3.94      6137.0        5551          639   

3        220             3.94      6137.0        5551          639   

4        220             5.05      6234.0        5511          818   

5        220             5.05      6234.0        5511          818   

6        165             4.75      6191.0        5408          770   


   b_h_visitor  b2_visitor  b3_visitor  b_hr_visitor  

0         1382         290          28           128  

1         1382         290          28           128  

2         1382         290          28           128  

3         1382         290          28           128  

4         1449         333          29           212  

5         1449         333          29           212  

6         1347         312          20           221  


[7 rows x 21 columns]

然后,您可以使用它merged_df来计算特征。例如(因为它似乎你希望你的特点np.arrays),计算之间的差异pa_home和pa_visitor(这仅仅是一个虚拟的例子):


>>> (merged_df['pa_home'] - merged_df['pa_visitor']).values

array([ 87.,  87.,  87.,  87., -10., -10.,  25.])


查看完整回答
反对 回复 2021-05-18
  • 2 回答
  • 0 关注
  • 262 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号