You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

循环创建全局子DataFrame后,如何批量添加列并解决报错?

批量给子DataFrame添加列的正确姿势

首先得说,你之前的第二个循环写法有问题才导致报错的。咱们先拆解下错误原因:

  • 第一行循环for k in globals().items()少了结尾的冒号;
  • 更关键的是,globals().items()返回的是**(变量名, 变量值)**这样的元组,你用%s去格式化这个元组肯定会报错,因为字符串格式化只接受单个字符串,但你传了一个包含两个元素的元组,这就是TypeError的根源。

而且,用globals()动态创建变量其实不是个好主意——全局命名空间会变得混乱,后续维护也麻烦。更推荐的方式是用字典来存储所有子DataFrame,这样批量操作起来顺手多了,咱们一步步来:

方法一:用字典存储子DataFrame(推荐)

# 先创建字典存储所有子DataFrame
partida_dfs = {}
Partidas = data2['Partida'].unique()
for partida in Partidas:
    # 替换空格为下划线作为字典的键
    key = partida.replace(' ', '_')
    # 把对应的子DataFrame存入字典(加copy避免视图修改影响原数据)
    partida_dfs[key] = data2.loc[data2['Partida'] == partida].copy()

# 批量添加'Top 10'列
for df in partida_dfs.values():
    df['Top 10'] = 'a'

这样操作的好处很明显:字典里的所有子DataFrame都能被轻松遍历,而且不会污染全局变量,后续想调用某个子DataFrame直接用partida_dfs['你的键名']就行。

方法二:如果一定要用全局变量(不推荐)

如果你坚持要保留全局变量的方式,那得正确遍历全局变量里的子DataFrame,比如:

# 先完成子DataFrame的创建(这部分你的代码是对的)
Partidas = data2['Partida'].unique()
Partida2 = [w.replace(' ', '_') for w in Partidas]
for i, j in zip(Partidas, Partida2):
    globals()[j] = data2.loc[data2['Partida'] == i].copy()

# 批量添加列
for key in Partida2:  # 直接用提前生成的变量名列表,精准遍历目标DataFrame
    globals()[key]['Top 10'] = 'a'

这里直接遍历我们提前生成的Partida2列表(也就是所有子DataFrame的变量名),这样就不会误操作其他全局变量,也避免了遍历globals().items()带来的元组问题。

最后提醒下:记得加.copy(),不然你操作的可能是原DataFrame的视图,修改会影响原数据哦。

内容的提问来源于stack exchange,提问作者Juan C

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:52:24