You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 06:03:11