添加DataFrame列默认值时,如何将其限制为特定行?

时间:2019-07-17 20:14:33

标签: python pandas beautifulsoup

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

我尝试添加一列,但是我在努力使前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'

2 个答案:

答案 0 :(得分:0)

您可以通过以下三个步骤进行操作:

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

away_team_stats = away_team_stats.loc[away_team_stats['Player_Name']!='Reserves', :]方法将按数字索引/列来切片数据框,而iloc方法将按索引/列标签来切片数据框

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

答案 1 :(得分: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'

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