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

pandas中for循环内pd.get_dummies结果循环外不生效问题

问题场景

数据集来自Kaggle泰坦尼克竞赛。
测试代码如下:

data = [train_data, test_data]

for d in data:
    print('Initial: ', d.columns)
    d = pd.get_dummies(d, columns=['Sex', 'Embarked'], drop_first=True)
    print('Finished: ', d.columns)
    print('-'*10)
    
print('\nOut the loop: ', train_data.columns)

运行输出结果:

Initial: Index(['Survived', 'Pclass', 'Sex', 'Age', 'SibSp',
       'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked', 'Title'],
      dtype='object')
Finished: Index(['Survived', 'Pclass', 'Age', 'SibSp', 'Parch',
       'Ticket', 'Fare', 'Cabin', 'Title', 'Sex_male', 'Embarked_Q', 'Embarked_S'],
      dtype='object')
----------
Initial: Index(['Pclass', 'Sex', 'Age', 'SibSp', 'Parch',
       'Ticket', 'Fare', 'Cabin', 'Embarked', 'Title'],
      dtype='object')
Finished: Index(['Pclass', 'Age', 'SibSp', 'Parch', 'Ticket',
       'Fare', 'Cabin', 'Title', 'Sex_male', 'Embarked_Q', 'Embarked_S'],
      dtype='object')
----------

Out the loop: Index(['Survived', 'Pclass', 'Sex', 'Age', 'SibSp',
       'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked', 'Title'],
      dtype='object')
核心疑问
  • 为什么for循环内打印列名时,可以看到pd.get_dummies生成的Sex_male、Embarked_Q、Embarked_S字段,循环外打印train_data列名时这些字段却不存在?
  • 为什么如果循环内不用pd.get_dummies,而是直接执行d['Rela'] = d['SibSp'] + d['Parch']创建新特征,循环外就能正常看到新增的Rela特征?
原因解释

本质是两个核心规则共同作用的结果,和pandas操作特性、Python变量引用逻辑直接相关:

  • 第一,pd.get_dummies本身不是原地修改操作:它不会改动你传入的原始DataFrame,只会返回一个完成了独热编码的全新DataFrame对象。循环里写d = pd.get_dummies(...),只是把临时循环变量d的指向,从最开始引用的原始train_data/test_data,改成了新生成的那个独热编码DataFrame。这个赋值动作只改临时变量,完全碰不到列表里存的原始数据集对象,所以退出循环后看原始train_data自然没有任何变化。
  • 第二,d['Rela'] = xxx这类写法是原地修改操作:这种写法不会改变d的引用指向,是直接在d当前绑定的原始DataFrame内存空间里新增字段,修改直接作用在原始train_data/test_data上,所以循环外能看到新增的特征。

正确实现方式

要在循环里完成独热编码的持久修改,选任意一种写法即可:

  1. 按索引遍历列表,把生成的新DataFrame回写到原列表对应位置
for idx in range(len(data)):
    data[idx] = pd.get_dummies(data[idx], columns=['Sex', 'Embarked'], drop_first=True)
  1. 手动拼接新列实现原地修改
for d in data:
    dummy_cols = pd.get_dummies(d[['Sex', 'Embarked']], drop_first=True)
    d[dummy_cols.columns] = dummy_cols
    d.drop(columns=['Sex', 'Embarked'], inplace=True)

内容的提问来源于stack exchange,提问作者Fancy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 13:12:18