如何使用Python Pandas循环创建英超2019/20赛季各球队主场比赛DataFrame
需求背景
我手头有个记录2019/20赛季英超所有赛事的DataFrame,核心字段包括HomeTeam(主队)、AwayTeam(客队)、Winner(获胜方),示例数据如下:
| HomeTeam | AwayTeam | Winner |
|---|---|---|
| Liverpool | Brighton | Liverpool |
| Chelsea | Watford | Chelsea |
| Brighton | Liverpool | Liverpool |
我已经写了一个函数,专门用来生成单支球队的主场比赛DataFrame:
'''传入球队名称,返回该球队的主场比赛DataFrame''' def team_home_df(c): return data[(data['HomeTeam'] == c)]
之前我都是手动调用这个函数赋值,比如:
liverpool_home_df = team_home_df('Liverpool')
现在想通过循环批量处理,为每支球队生成[球队名]_home_df格式的变量(比如Chelsea_home_df)。我已经通过以下代码获取了所有球队的名称数组:
teams = [] clubs = data['HomeTeam'].unique() teams.append(clubs) print(teams)
输出结果为:
[array(['Liverpool', 'WestHam', 'Bournemouth', 'Burnley', 'CrystalPalace', 'Watford', 'Tottenham', 'Leicester', 'Newcastle', 'ManUnited', 'Arsenal', 'AstonVilla', 'Brighton', 'Everton', 'Norwich', 'Southampton', 'ManCity', 'SheffieldUnited', 'Chelsea', 'Wolves'], dtype=object)]
想请教怎么实现这个循环逻辑?
可行解决方案
首先先纠正一个小细节:你当前的teams是嵌套列表(外层多包了一层),其实直接用clubs = data['HomeTeam'].unique()就足够了,不需要再append到teams里,这样后续循环会更顺畅。
方法1:直接生成全局变量(最直接)
如果你就是想要一个个独立的xxx_home_df变量,可以操作Python的全局变量字典globals()来实现:
# 获取一维的球队列表 clubs = data['HomeTeam'].unique() # 循环遍历每支球队 for club in clubs: # 拼接出目标变量名,比如"Liverpool_home_df" var_name = f"{club}_home_df" # 将生成的DataFrame赋值给这个全局变量 globals()[var_name] = team_home_df(club)
循环结束后,你就能直接使用Liverpool_home_df、ManCity_home_df这类变量,和手动赋值的效果完全一致。
方法2:用字典统一管理(更规范)
如果不想让全局空间塞满零散变量,更推荐把所有球队的主场DataFrame放进一个字典里,管理起来更清爽:
clubs = data['HomeTeam'].unique() # 初始化空字典存储所有结果 team_home_dfs = {} for club in clubs: team_home_dfs[club] = team_home_df(club)
之后要调用某支球队的数据,直接用team_home_dfs['Liverpool']就能拿到对应的DataFrame,这种方式更符合Python编码规范,也避免了全局变量污染。
避坑提醒:别用exec
虽然exec也能实现动态创建变量,比如:
for club in clubs: exec(f"{club}_home_df = team_home_df('{club}')")
但这种方式风险很高——如果球队名称包含特殊字符(比如单引号),代码会直接报错,而且可读性差,不推荐使用。
内容的提问来源于stack exchange,提问作者Kamil_Sja

