覆盖使用Python for循环创建的列中的值

时间:2019-08-04 19:47:57

标签: python python-3.x pandas dataframe for-loop

我正在根据基本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

1 个答案:

答案 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']

选项A: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)

选项B:list comprehension

df_list = [pd.read_html(url_base + team)[1].assign(team=team) for team in team_list]

df = pd.concat(df_list)

df.head()

enter image description here

df.tail()

enter image description here