Python循环批量命名变量:DataFrame按月度拆分列数据需求
解决方案
你的方法存在的问题
- 方法1:Python不允许直接用字符串表达式作为变量名赋值(比如
str(i)+str(j)+'_col2'=...是语法错误),而且你将j转为字符串后,j*100会变成字符串重复(例如'01'*100),完全无法正确截取100行数据。 - 方法2:列表操作逻辑混乱,年份循环的结果没有用到变量命名中,且仅生成了12个元素,完全没有对应24个数据块的需求,也未处理列拆分。
推荐方案:用字典存储拆分结果(更易管理)
直接创建大量全局变量容易引发命名冲突,用字典存储更合理,键为你需要的变量名,值为拆分后的Series:
import pandas as pd # 示例DataFrame,替换为你的实际数据 df = pd.DataFrame(pd.np.random.rand(2400, 9)) # 初始化存储字典 split_vars = {} # 遍历两年(24个数据块对应24个月) for year in [2018, 2019]: for month in range(1, 13): # 计算当前数据块的起始/结束行索引 block_num = (year - 2018) * 12 + (month - 1) start = block_num * 100 end = start + 100 # 遍历每一列生成对应变量 for col_idx in df.columns: # 生成变量名:年份+两位月份+_colX var_name = f"{year}{month:02d}_col{col_idx + 1}" # 存储拆分后的列数据 split_vars[var_name] = df.iloc[start:end, col_idx] # 调用示例:获取2018年1月的第2列数据 print(split_vars['201801_col2'])
直接创建全局变量的方案(不推荐但满足需求)
如果一定要生成独立的全局变量,可以通过globals()字典实现:
import pandas as pd df = pd.DataFrame(pd.np.random.rand(2400, 9)) for year in [2018, 2019]: for month in range(1, 13): block_num = (year - 2018) * 12 + (month - 1) start = block_num * 100 end = start + 100 for col_idx in df.columns: var_name = f"{year}{month:02d}_col{col_idx + 1}" # 直接创建全局变量 globals()[var_name] = df.iloc[start:end, col_idx] # 直接调用变量 print(201801_col2)
关键说明
- 年份范围:示例用2018、2019两年对应24个数据块,可根据你的实际年份调整。
- 列名适配:如果你的DataFrame列已经命名为
col1-col9,直接将col_idx +1改为col_idx即可。 - 行索引计算:每个数据块严格对应100行,确保
start和end的计算准确。
内容的提问来源于stack exchange,提问作者Sergio Dom.
相关产品推荐
相关产品推荐

