Python循环请求NBA数据时重复返回结果问题求助
问题原因分析
你的问题核心出在这一行代码:
stats_df=[stats_df.assign(Date2=Date2) for Date2 in df.loc[ : ,"Date2"]]
当你循环遍历每个URL时,这个列表推导式会遍历整个Date2列的所有值,把当前URL对应的stats_df(单次请求返回的原始数据)复制多份(份数等于你Date2列的行数),每份分别绑定一个Date2值,然后把这些重复的DataFrame全部追加到lineup_df中。
举个实际例子:假设你的df有2行日期数据,那么每次循环一个URL时,都会生成2个内容几乎一样的stats_df(仅Date2不同),两次URL循环下来,原本应该只有2组独立数据,结果变成了2×2=4组——也就是每个原始数据被重复返回了两次。
修复方案
你需要让每个URL对应df中同一行的Date2值,而不是遍历整个Date2列。可以把循环逻辑改成同时遍历Date和Date2的配对,这样每次请求后只给当前数据添加对应的Date2:
import requests import csv from random import choice import pandas as pd url_template = "https://stats.nba.com/stats/leaguedashptstats?College=&Conference=&Country=&DateFrom={date}&DateTo={date}&Division=&DraftPick=&DraftYear=&GameScope=&Height=&LastNGames=0&LeagueID=00&Location=&Month=0&OpponentTeamID=0&Outcome=&PORound=0&PerMode=Totals&PlayerExperience=&PlayerOrTeam=Player&PlayerPosition=&PtMeasureType=SpeedDistance&Season=2017-18&SeasonSegment=&SeasonType=Regular+Season&StarterBench=&TeamID=0&VsConference=&VsDivision=&Weight=" lineup_df = pd.DataFrame() df = pd.read_csv('NBADates.csv') # 同时遍历Date和Date2列的配对,保证每个URL对应正确的Date2 for date, date2 in zip(df["Date"], df["Date2"]): url = url_template.format(date=date) data = requests.get(url, headers={ 'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:46.0) Gecko/20100101 Firefox/46.0',}) headers = data.json()['resultSets'][0]['headers'] stats = data.json()['resultSets'][0]['rowSet'] stats_df = pd.DataFrame(stats, columns=headers) # 仅给当前数据添加对应行的Date2值 stats_df = stats_df.assign(Date2=date2) # 追加到总表 lineup_df = lineup_df.append(stats_df, ignore_index=True) lineup_df.to_csv("Stats.csv")
另外补充:你代码里的df.to_dict('series')这一行没有实际作用,可以直接删掉,它不会影响后续逻辑。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

