循环创建全局子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
相关产品推荐
相关产品推荐

