我正在做第一个Kaggle挑战,对此行为感到震惊。
combine由两个pd.DataFrame组成,一个是训练集,另一个是测试集。我想删除两列,因此创建了一个for循环,该循环遍历合并中的项目。
for dataset in combine:
dataset = dataset.drop(['Ticket', 'Cabin'], axis=1)
print(dataset.columns)
for dataset in combine:
print(dataset.columns)
由于某种原因,赋值仅发生在本地,而执行另一个for循环则表明实际数据未更改。输出如下。
Index(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp',
'Parch', 'Fare', 'Embarked'],
dtype='object')
Index(['PassengerId', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare',
'Embarked'],
dtype='object')
Index(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp',
'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'],
dtype='object')
Index(['PassengerId', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp', 'Parch',
'Ticket', 'Fare', 'Cabin', 'Embarked'],
dtype='object')
如您所见,在第二个for循环中,列返回了。问题出在哪儿?我是否误解了for循环在Python中的工作原理?
编辑:
@ kaya3 pandas.Series.map并非如此
for dataset in combine:
dataset['Name'] = dataset['Name'].map(name_map)
dataset['Name'] = dataset['Name'].fillna(0)
此代码更改合并中的原始dataFrames。文档说它返回序列(不是None)。如何判断该函数是否会改变值?
答案 0 :(得分:1)
在循环中,dataset
是合并中的DataFrame的副本,因此,当您更改dataset
时,您并没有更改combine
中的实际DataFrame,只需复制。要更改列表中的实际DataFrame,请尝试如下操作:
for ii in range(len(combine)):
combine[ii] = combine[ii].drop(['Ticket', 'Cabin'], axis=1)
现在,您要更改列表中的变量,而不仅仅是副本。