循环创建按月过滤的DataFrame报错:SyntaxError: can't assign to function call
解决用f-string命名DataFrame的语法错误
错误原因
你试图用f-string直接作为变量名赋值(比如f"df_{year_month}" = 过滤后的DataFrame),这在Python中是非法的——赋值语句的左侧必须是合法变量名,而f-string是表达式/函数调用,因此触发SyntaxError: can't assign to function call。
正确实现方式
方法1:用字典存储月度DataFrame(推荐)
用字典映射年月标识与对应DataFrame,既安全又便于后续操作:
import pandas as pd # 假设原始数据df包含'month'列,格式为'YYYY-MM' df = pd.DataFrame( {'month': pd.date_range('2022-01', '2023-12', freq='M').strftime('%Y-%m'), 'value': range(24)} ) monthly_dfs = {} # 遍历2022-2023所有月份 for year in [2022, 2023]: for month in range(1, 13): year_month = f"{year}-{month:02d}" # 过滤对应月份数据并存入字典 monthly_dfs[year_month] = df[df['month'] == year_month] # 合并所有月度DataFrame用于报表 merged_df = pd.concat(monthly_dfs.values(), ignore_index=True)
方法2:动态创建全局变量(不推荐)
若需生成独立变量名,可借助globals()字典,但这种方式易引发变量冲突,不利于维护:
for year in [2022, 2023]: for month in range(1, 13): year_month = f"{year}-{month:02d}" var_name = f"df_{year_month.replace('-', '_')}" globals()[var_name] = df[df['month'] == year_month] # 可直接调用df_2022_01、df_2022_02等变量
注意事项
优先使用字典存储:字典能清晰管理所有月度数据,遍历、修改、合并操作更便捷;动态创建变量会降低代码可读性,增加排查难度。
内容的提问来源于stack exchange,提问作者Cesar Pereira
相关产品推荐
相关产品推荐

