Pandas动态生成子DataFrame并重命名列时遇NameError问题求助
解决Pandas动态生成子DataFrame时的列重命名错误
原始数据与需求
原始DataFrame定义如下:
import pandas as pd data = { "Category": ["A","A","B","C","C"], "Value": [16,10,8,8.3,17] } df = pd.DataFrame(data)
需求:
- 为
Category列的每个唯一值生成对应子DataFrame(如df_A、df_B、df_C) - 子DataFrame仅保留对应分类的行
- 将子DataFrame的
Value列重命名为Value+分类名(如df_A的列改为ValueA)
错误原因
出现NameError: name 'ValueA' is not defined的核心原因是:重命名列时误将新列名当作变量使用(比如写ValueA而非字符串"ValueA"),Python会尝试查找名为ValueA的变量,找不到就抛出该错误。
正确实现代码
通过循环遍历分类唯一值,结合字符串构造与全局变量绑定,可完成需求并避免错误:
import pandas as pd data = { "Category": ["A","A","B","C","C"], "Value": [16,10,8,8.3,17] } df = pd.DataFrame(data) # 遍历每个唯一分类 for cat in df['Category'].unique(): # 筛选对应分类的行,用copy()避免修改原DataFrame sub_df = df[df['Category'] == cat].copy() # 构造新列名字符串,用f-string拼接分类名 sub_df.rename(columns={'Value': f'Value{cat}'}, inplace=True) # 可选:删除原Category列(若不需要保留分类标识) sub_df.drop('Category', axis=1, inplace=True) # 动态生成全局变量,比如df_A、df_B globals()[f'df_{cat}'] = sub_df # 验证结果 print(df_A) # 输出: # ValueA # 0 16 # 1 10
关键注意点
- 新列名必须是字符串格式,用
f'Value{cat}'确保生成的是字符串而非变量引用 - 使用
globals()动态创建全局变量,实现df_A这类命名的子DataFrame - 调用
copy()避免子DataFrame与原DataFrame共享数据内存,防止后续操作污染原数据
内容的提问来源于stack exchange,提问作者Ziggy
相关产品推荐
相关产品推荐

