for循环中使用pandas.get_dummies无法修改DataFrame,求解决方案
解决Pandas get_dummies在循环中无法更新原DataFrame的问题
问题的核心在于:pd.get_dummies() 不会直接修改原DataFrame,而是返回一个全新的DataFrame对象。你的两种循环方式都没有把新生成的对象重新赋值给原来的data_train和data_val变量,所以原变量自然不会有变化。
快速解决方案
方案1:直接手动赋值(最简单直观)
既然get_dummies没有inplace参数,直接对每个DataFrame单独处理并重新赋值是最清晰的方式:
data_train = pd.get_dummies(data_train, columns=categorical_fields) data_val = pd.get_dummies(data_val, columns=categorical_fields)
方案2:用列表推导式批量处理并解包
如果想减少重复代码,可以用列表推导式生成处理后的DataFrame列表,再直接赋值给原变量:
data_train, data_val = [pd.get_dummies(df, columns=categorical_fields) for df in [data_train, data_val]]
方案3:用字典管理后更新
如果后续还有更多DataFrame需要处理,用字典来管理会更灵活:
# 把需要处理的DataFrame存入字典 df_dict = {"train": data_train, "val": data_val} # 循环处理每个DataFrame for name in df_dict: df_dict[name] = pd.get_dummies(df_dict[name], columns=categorical_fields) # 把处理后的结果重新赋值给原变量 data_train = df_dict["train"] data_val = df_dict["val"]
为什么你的原代码无效?
- 第一种循环:
for df in data_cleaner中的df只是原DataFrame的临时引用,当你执行df = pd.get_dummies(...)时,只是把df指向了新的对象,完全不会影响原来的data_train和data_val。 - 第二种循环:你修改了
data_cleaner[i]的值,但data_train本身是独立变量,它并没有和data_cleaner列表绑定——列表里存的只是原对象的引用,当你把data_cleaner[i]赋值为新对象后,data_train依然指向旧的未处理对象。
内容的提问来源于stack exchange,提问作者Daisuke SHIBATO
相关产品推荐
相关产品推荐

