如何在 Python 中根据两个不同 Pandas Dataframe 的匹配行计算和存储结果

Asa*_*ain 9 python pandas

我有三个从 Excel 文件导入的 DataFrame。下面以 HTML 表格形式给出数据框,

Season Wise Record(这包含一个最初Reward初始化的列0

<table><tbody><tr><th>Unnamed: 0</th><th>Name</th><th>Team</th><th>Position</th><th>Games Played</th><th>PassingCompletions</th><th>PassingYards</th><th>PassingTouchdowns</th><th>RushingYards</th><th>RushingTouchdowns</th><th>ReceivingYards</th><th>Receptions</th><th>Touchdowns</th><th>Type</th><th>Sacks</th><th>SoloTackles</th><th>TacklesForLoss</th><th>FumblesForced</th><th>DefensiveTouchdowns</th><th>Interceptions</th><th>PassesDefended</th><th>ReceivingTouchdowns</th><th>Reward</th></tr><tr><td>0</td><td>Tom Brady</td><td>TAM</td><td>QB</td><td>17</td><td>485</td><td>5316</td><td>43</td><td>81</td><td>2</td><td>0</td><td>0</td><td>2</td><td>OFFENSE</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>1</td><td>Justin Herbert</td><td>LAC</td><td>QB</td><td>17</td><td>443</td><td>5014</td><td>38</td><td>302</td><td>3</td><td>0</td><td>0</td><td>3</td><td>OFFENSE</td><td>0</td><td>1</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>2</td><td>Matthew Stafford</td><td>LAR</td><td>QB</td><td>17</td><td>404</td><td>4886</td><td>41</td><td>43</td><td>0</td><td>0</td><td>0</td><td>0</td><td>OFFENSE</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>3</td><td>Patrick Mahomes</td><td>KAN</td><td>QB</td><td>17</td><td>436</td><td>4839</td><td>37</td><td>381</td><td>2</td><td>0</td><td>0</td><td>2</td><td>OFFENSE</td><td>0</td><td>1</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>4</td><td>Derek Carr</td><td>LVR</td><td>QB</td><td>17</td><td>428</td><td>4804</td><td>23</td><td>108</td><td>0</td><td>0</td><td>0</td><td>0</td><td>OFFENSE</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>5</td><td>Joe Burrow</td><td>CIN</td><td>QB</td><td>16</td><td>366</td><td>4611</td><td>34</td><td>118</td><td>2</td><td>0</td><td>0</td><td>2</td><td>OFFENSE</td><td>0</td><td>1</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>6</td><td>Dak Prescott</td><td>DAL</td><td>QB</td><td>16</td><td>410</td><td>4449</td><td>37</td><td>146</td><td>1</td><td>0</td><td>0</td><td>1</td><td>OFFENSE</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>7</td><td>Josh Allen</td><td>BUF</td><td>QB</td><td>17</td><td>409</td><td>4407</td><td>36</td><td>763</td><td>6</td><td>0</td><td>0</td><td>6</td><td>OFFENSE</td><td>0</td><td>1</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>88</td><td>Ezekiel Elliott</td><td>DAL</td><td>RB</td><td>17</td><td>1</td><td>4</td><td>0</td><td>1002</td><td>10</td><td>287</td><td>47</td><td>12</td><td>OFFENSE</td><td>0</td><td>1</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>2</td><td>0</td></tr><tr><td>89</td><td>Marcus Mariota</td><td>LVR</td><td>QB</td><td>10</td><td>1</td><td>4</td><td>0</td><td>87</td><td>1</td><td>0</td><td>0</td><td>1</td><td>OFFENSE</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>90</td><td>Johnny Hekker</td><td>LAR</td><td>QB</td><td>17</td><td>1</td><td>2</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>OFFENSE</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>91</td><td>Greg Ward</td><td>PHI</td><td>QB</td><td>17</td><td>1</td><td>2</td><td>0</td><td>0</td><td>0</td><td>95</td><td>7</td><td>3</td><td>OFFENSE</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>3</td><td>0</td></tr><tr><td>92</td><td>Kendall Hinton</td><td>DEN</td><td>WR</td><td>16</td><td>1</td><td>1</td><td>0</td><td>0</td><td>0</td><td>175</td><td>15</td><td>1</td><td>OFFENSE</td><td>0</td><td>1</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>1</td><td>0</td></tr><tr><td>93</td><td>Keenan Allen</td><td>LAC</td><td>WR</td><td>16</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>1138</td><td>106</td><td>6</td><td>OFFENSE</td><td>0</td><td>1</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>6</td><td>0</td></tr><tr><td>94</td><td>Danny Amendola</td><td>HOU</td><td>QB</td><td>8</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>248</td><td>24</td><td>3</td><td>OFFENSE</td><td>0</td><td>1</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>3</td><td>0</td></tr><tr><td>95</td><td>Cole Beasley</td><td>BUF</td><td>WR</td><td>16</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>693</td><td>82</td><td>1</td><td>OFFENSE</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>1</td><td>0</td></tr></tbody></table>
Run Code Online (Sandbox Code Playgroud)

Game Wise Record(我只添加一些示例行,其中有 20k+ 行)

<table><tbody><tr><th>Index</th><th>Week</th><th>Name</th><th>Team</th><th>Starter</th><th>Interceptions</th><th>PassesDefended</th><th>Sacks</th><th>SoloTackles</th><th>TacklesForLoss</th><th>FumblesForced</th><th>PassesCompletions</th><th>PassingYards</th><th>PassingTouchdowns</th><th>PassingInterceptions</th><th>RushingYards</th><th>RushingTouchdowns</th><th>Receptions</th><th>ReceivingYards</th><th>ReceivingTouchdowns</th></tr><tr><td>0</td><td>1</td><td>Jourdan Lewis</td><td>DAL</td><td>1</td><td>1</td><td>2</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>1</td><td>1</td><td>Trevon Diggs</td><td>DAL</td><td>1</td><td>1</td><td>2</td><td>0</td><td>1</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>2</td><td>1</td><td>Anthony Brown</td><td>DAL</td><td>1</td><td>0</td><td>0</td><td>0</td><td>6</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>3</td><td>1</td><td>Jayron Kearse</td><td>DAL</td><td>0</td><td>0</td><td>0</td><td>0</td><td>5</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>4</td><td>1</td><td>Micah Parsons</td><td>DAL</td><td>1</td><td>0</td><td>1</td><td>0</td><td>3</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>5</td><td>1</td><td>Keanu Neal</td><td>DAL</td><td>1</td><td>0</td><td>0</td><td>0</td><td>3</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>6</td><td>1</td><td>DeMarcus Lawrence</td><td>DAL</td><td>1</td><td>0</td><td>0</td><td>0</td><td>4</td><td>0</td><td>1</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>7</td><td>1</td><td>Jaylon Smith</td><td>DAL</td><td>0</td><td>0</td><td>0</td><td>0</td><td>2</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>8</td><td>1</td><td>Dorance Armstrong Jr.</td><td>DAL</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>9</td><td>1</td><td>Tarell Basham</td><td>DAL</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>5175</td><td>5</td><td>Patrick Mahomes</td><td>KAN</td><td>1</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>33</td><td>272</td><td>2</td><td>2</td><td>61</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>5176</td><td>5</td><td>Darrel Williams</td><td>KAN</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>27</td><td>0</td><td>3</td><td>18</td><td>0</td></tr><tr><td>5177</td><td>5</td><td>Tyreek Hill</td><td>KAN</td><td>1</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>15</td><td>0</td><td>7</td><td>63</td><td>0</td></tr><tr><td>5178</td><td>5</td><td>Clyde Edwards-Helaire</td><td>KAN</td><td>1</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>13</td><td>0</td><td>1</td><td>11</td><td>0</td></tr><tr><td>5179</td><td>5</td><td>Jerick McKinnon</td><td>KAN</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>2</td><td>0</td><td>2</td><td>13</td><td>0</td></tr><tr><td>5180</td><td>5</td><td>Michael Burton</td><td>KAN</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>2</td><td>0</td><td>0</td><td>0</td><td>0</td></tr><tr><td>5181</td><td>5</td><td>Mecole Hardman</td><td>KAN</td><td>1</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>9</td><td>76</td><td>0</td></tr><tr><td>5182</td><td>5</td><td>Travis Kelce</td><td>KAN</td><td>1</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>6</td><td>57</td><td>1</td></tr></tbody></table>
Run Code Online (Sandbox Code Playgroud)

最后,有一个Player Goals File这是一个 Excel 文件,其中包含每个职位的表格,我仅共享 QB 表格,以保持问题简短。如果需要,我也可以共享其余部分)

<ta

小智 1

我希望我正确理解了你的意图。为了避免双重for循环,您需要使用groupby()方法,然后将所需的函数应用于组的每一行;最后,聚合函数 ( sum()) 应该应用于该组。虽然您可以使用Name作为分组键,但我建议添加PlayerID.

该方法几乎不需要准备:

data = data.join(
    df.reset_index().set_index(['Name', 'Team'], drop=False)[['index','Position']],
    on=['Name','Team'],
    how='left'
).rename({'index':'PlayerID'}, axis=1)
Run Code Online (Sandbox Code Playgroud)

data我们向DataFrame添加 2 列,即Position和 ,PlayerID这是第一个 DataFrame 的索引df。我们搜索了ID检查NameTeam仍然可能会导致碰撞(当同一队中有2名同名球员时)。

完成后,代码的最后一部分将如下所示:

for key, value in positions.items(): # Positions has a list of all the positions 
    for (_, row) in rewards[key].iterrows(): # Rewards is a Dict containing Pandas Dataframes against each position
        if row['Goal Type'] == 'Season':
            if row['Target'] in df.columns:
                df['Reward'] += df.apply(lambda x: calculatePointsSeason(
                    x[row['Target']], row['Min Value'], row['Games Required'],
                    row['Max Value'], key, x['Position'],
                    row['PCC Reward'], x['Games Played']
                ), axis=1)
        else: # For Game wise points
            if row['Target'] in data.columns: # I added these 2 checks because sometimes target is not presented in the columns which raises the error
                df['Reward'] = df['Reward'].add(
                    data.groupby('PlayerID').apply(
                        lambda group: group.apply(lambda game_player: calculatePointsGame(
                            game_player[row['Target']], 
                            row['Min Value'], row['Max Value'], 
                            key, game_player['Position'],
                            row['PCC Reward'], 
                            game_player['Starter'],
                            row['Started']
                        ), axis=1).sum()
                    ),
                    fill_value=0
                )
Run Code Online (Sandbox Code Playgroud)


Copyright Info

© Copyright 2013-2021 admin@qa.1r1g.com

如未特别说明,本网站的内容使用如下协议:
Creative Commons Atution-NonCommercial-ShareAlike 4.0 International license
.

用以下方式浏览
回到顶部