我正在根据基本URL构建自动的MLB时间表,并循环显示URL中出现的团队名称列表。使用pd.read_html获得每个团队的时间表。对于每个团队的页面,我唯一缺少的是团队名称本身,我希望将其作为新列“ team_name”。在这篇文章的结尾,我有一个小小的目标示例。
下面是我到目前为止所拥有的,如果运行此命令,则打印输出恰好满足了我只需要一支团队的需要。
const filtered = items.filter(function(item) {
for (var key in item) {
if (null == item[key])
return false;
}
return true;
});
问题是,当我在team_list中拥有所有30个团队时,team_name的值不断被覆盖,因此所有4000多个记录都列出了相同的团队名称(team_list中的最后一个)。我尝试通过使用
仅动态分配团队价值的某些行import pandas as pd
url_base = "https://www.teamrankings.com/mlb/team/"
team_list = ['seattle-mariners']
df = pd.DataFrame()
for team in (team_list):
new_url = url_base + team
df = df.append(pd.read_html(new_url)[1])
df['team_name'] = team
print(df[['team_name', 'Opponent']])
其中,a,b是索引团队在数据框中的开始和结束行;但这给出了KeyError:'team_name'。我还尝试过为team_name使用占位符系列和数据帧,然后在以后与df合并,但是会出现重复错误。在更大范围内,我正在寻找的是这样:
df['team_name'][a:b] = team
答案 0 :(得分:4)
原始代码df['team_name'] = team
会为整个team_name
重写df
。下面的代码创建一个占位符df_team
,先更新team_name
,然后再更新df.append(df_team)
。
url_base = "https://www.teamrankings.com/mlb/team/"
team_list = ['seattle-mariners', 'houston-astros']
for loop
df_list = list()
for team in (team_list):
new_url = url_base + team
df_team = pd.read_html(new_url)[1]
df_team['team_name'] = team
df_list.append(df_team)
df = pd.concat(df_list)
list comprehension
:df_list = [pd.read_html(url_base + team)[1].assign(team=team) for team in team_list]
df = pd.concat(df_list)