0

我正在使用 beautifulsoup 和 pandas 的组合来尝试通过遍历 boxscore 页面来获取运动参考数据,获取每个团队的数据帧并将它们连接在一起。我注意到表格在每一页上的格式化方式,有行分隔符将启动器与保留区分开,并且此行分隔器在“启动器”列中具有值“保留”(我稍后将其重命名为“玩家名称”) ,其余列标题重复其其余值。当此数据输入数据帧时,行分隔符将作为普通行引入。我想添加一个单独的列,其中包含该玩家是否开始游戏的 Y/N 值,并删除“Starters”列等于“Reserves”的所有记录。

我尝试添加一列,但我正在努力使用一种方法来获取前 x 行的默认值是“Y”,其余行的默认值为“N”。

这是一个简短的表格示例,后面是我正在使用的代码。如果您有任何想法,请告诉我!

编辑:我可能过度简化了这一点,因为实际上有两个标题列,并且在尝试所提供的解决方案时似乎这会导致问题。如何删除仅说明“基本框得分统计”和“高级框得分统计”的第一个标题列?

Basic Box Score Stats            Advanced Box Score Stats
Starters              MP    FG   +/-  xyz%
Player1               20:00 17   5    12
Player2               15:00 8    4    10
Player3               10:00 9    3    8
Player4               9:00  3    2    6
Player5               8:00  1    1    4
Reserves              MP    FG   +/-  xyz%
Player4               7:00  1    1    2
Player5               4:00  1    1    2
Player6               3:30  1    1    2
import pandas as pd
from bs4 import BeautifulSoup
#performed steps in bs4 to get the links to individual boxscores
    for boxscore_link in boxscore_links:
        basketball_ref_dfs=pd.read_html(MainURL + boxscore_link)
        if len(basketball_ref_dfs) = 4:
            away_team_stats = pd.concat([basketball_ref_dfs[0],basketball_ref_dfs[1]])
            home_team_stats = pd.concat([basketball_ref_dfs[2],basketball_ref_dfs[3]])
        else:
            away_team_stats = basketball_ref_dfs[0]
            home_team_stats = basketball_ref_dfs[1]
#new code to be added here to fix 'reserve' row header for away/home_team_stats        
full_game_stats = pd.concat([away_team_stats,home_team_stats])
        full_season_stats = full_season_stats.append(full_game_stats,ignore_index=True)
    full_season_stats

#what I want:
away_team_stats['Starter']='Y' # + some condition to only set this value for the first x occurrences or set to 'Y' until row value equals Reserve, then set remaining to 'N'
4

2 回答 2

0

您可以分三个步骤执行此操作:

  1. 使用为整个列设置默认值“N”away_team_stats['Starter']='N'
  2. iloc使用with 方法将前 x 行的值设置为“Y” away_team_stats.iloc[:x, 2]='Y' (如果附加到示例数据,我相信“Starter”列将位于位置 2,但您可能需要对其进行编辑)
  3. 'Player_Name' == 'Reserves'使用withloc方法删除行withaway_team_stats = away_team_stats.loc[away_team_stats['Player_Name']!='Reserves', :]

iloc方法将通过数字索引/列对loc您的数据框进行切片,并且该方法将通过索引/列标签对您的数据框进行切片

https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html

于 2019-07-17T20:25:08.953 回答
0

你可以这样做,如果你知道你的“保留”值出现的索引,假设在这种情况下它出现在第 10 条记录中。我最初将所有内容都设置为“N”,然后将前 10 行设置为“Y”。

away_team_stats['Starter'] = 'N'
away_team_stats.loc[:9, 'Starter'] = 'Y'


或者你可以这样做:

idx = away_team_stats.loc[away_team_stats['Starter'] == 'Reserve'].index[0]

这为您提供了第一次出现在哪个索引中。

你现在可以像上面那样做:

away_team_stats.loc[:idx, 'Starter'] = 'Y'
away_team_stats.loc[idx+1:, 'Starter'] = 'N'

将前几行设置为“保留”一词第一次出现之前的“Y”,然后将其余的设置为“N”。

于 2019-07-17T20:42:44.190 回答