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上,所以循环外能看到新增的特征。
正确实现方式
要在循环里完成独热编码的持久修改,选任意一种写法即可:
- 按索引遍历列表,把生成的新DataFrame回写到原列表对应位置
for idx in range(len(data)): data[idx] = pd.get_dummies(data[idx], columns=['Sex', 'Embarked'], drop_first=True)
- 手动拼接新列实现原地修改
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
相关产品推荐
相关产品推荐

