是否存在Pythonic方法,可迭代分组DataFrame生成各西班牙省份的独立DataFrame
核心问题定位
你之前写的循环代码跑不通的根源有两个:
- 变量重名冲突:原本用来存计数的数字变量
counter,在内部for循环里被直接赋值为筛选得到的DataFrame,后续执行counter -=1时会因为DataFrame无法和整数做减法直接报错 - 循环逻辑完全错乱:while判断条件的初始值就满足
counter <= 分组数+1的要求,条件永远为真,根本没法靠计数器递减逻辑正常退出循环
另外你提到之前用.groupby没达到预期,本质是没有用对groupby的原生迭代能力——pandas的groupby对象天生就是为“按列拆分全量数据为独立子集”的场景设计的,完全不需要自己手写计数器、嵌套循环来实现逻辑。
首选实现方案
用字典存储所有省份对应的独立DataFrame,这是pandas处理分拆数据的标准操作,不会污染全局命名空间,调用和后续维护成本极低:
# 按Provincia列分组,自动遍历所有省份生成子集 province_data_map = { province_name: subset_df.reset_index(drop=True) for province_name, subset_df in merged.groupby('Provincia') }
生成的province_data_map结构为:
- 键:对应Provincia列里的省份名称(比如
'Madrid'、'A Coruña') - 值:该省份对应的全量时序子集DataFrame
需要调用某个省份数据时,直接通过键取值即可,比如取马德里数据:
madrid_df = province_data_map['Madrid']
这套逻辑不需要你手动统计有多少个省份,不管是52个还是后续增减省份,代码都不需要修改。
特殊场景实现(不推荐)
如果你确实需要生成和你举例格式一致的全局独立变量(比如Madrid = pd.DataFrame(...)),可以通过Python动态命名空间赋值实现,但必须要处理省份名里的特殊字符——带空格、带重音的西班牙省名本身不是合法的Python变量名,直接赋值会报语法错误:
for prov_name, subset_df in merged.groupby('Provincia'): # 清洗省份名为合法Python变量:替换空格、去掉重音符号 valid_var_name = ( prov_name.replace(' ', '_') .replace('á', 'a') .replace('é', 'e') .replace('í', 'i') .replace('ó', 'o') .replace('ú', 'u') ) # 动态给全局变量赋值 globals()[valid_var_name] = subset_df.reset_index(drop=True)
注意:这种动态生成全局变量的方式维护成本很高,很容易因为变量名拼写错误、特殊字符没处理全踩坑,除非有强制的格式要求,否则优先选择字典存储的方案。
内容的提问来源于stack exchange,提问作者Francisco Barriga
相关产品推荐
相关产品推荐

