Python循环创建多个DataFrame报错'tuple index out of range'求助
解决从字符串列表创建多个DataFrame的报错问题
嘿,我来帮你排查这个问题~你遇到的tuple index out of range错误,根源出在使用exec时的字符串格式化方式上,咱们一步步来解决:
问题分析
你的代码里,当r是'A'、'B'这类字符串值时,exec('df_{}=df[df.C=={}]'.format(r))会生成这样的代码:
df_A=df[df.C==A]
这里的A没有被引号包裹,Python会把它当成一个变量名去查找,但你根本没定义过A这个变量,这就导致了错误(报错信息可能因为环境略有差异,但核心问题是字符串未正确转义)。另外还要注意:别用list当变量名,它会覆盖Python内置的list类型,容易引发其他隐性问题。
快速修复方案
只需要给格式化字符串里的第二个{}加上引号,让生成的代码里的匹配值是字符串类型:
import pandas as pd import numpy as np df = pd.DataFrame({'A': range(1, 5), 'B': np.random.randn(4), 'C':['A','A','B','C']}) unique_list = df.C.unique().tolist() for r in unique_list: exec('df_{}=df[df.C=="{}"]'.format(r))
更推荐的优雅写法
其实用exec动态创建变量不是最佳实践——它不安全,也不利于代码维护和调试。更推荐用字典来存储这些拆分后的DataFrame:
import pandas as pd import numpy as np df = pd.DataFrame({'A': range(1, 5), 'B': np.random.randn(4), 'C':['A','A','B','C']}) df_dict = {} for r in df.C.unique(): df_dict[f'df_{r}'] = df[df.C == r] # 访问的时候直接用字典键取值 print(df_dict['df_A'])
这种方式既清晰,又不会污染全局命名空间,后续要遍历或修改这些DataFrame也更方便。
内容的提问来源于stack exchange,提问作者Arindam Bose
相关产品推荐
相关产品推荐

