变量仅在 for 循环内局部赋值
Variables are assigned only locally inside a for loop
我正在做第一个 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)
此代码更改了合并中的原始数据帧。文档说它是 returns 系列(不是 None)。我如何判断函数是否会改变值?
当你在循环中时,dataset
是合并中 DataFrame 的副本,所以当你更改 dataset
时,你并没有更改 combine
中的实际 DataFrame,只是副本。要更改列表中的实际 DataFrame,请尝试这样的操作:
for ii in range(len(combine)):
combine[ii] = combine[ii].drop(['Ticket', 'Cabin'], axis=1)
现在您正在更改列表中的变量,而不仅仅是副本。
我正在做第一个 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)
此代码更改了合并中的原始数据帧。文档说它是 returns 系列(不是 None)。我如何判断函数是否会改变值?
当你在循环中时,dataset
是合并中 DataFrame 的副本,所以当你更改 dataset
时,你并没有更改 combine
中的实际 DataFrame,只是副本。要更改列表中的实际 DataFrame,请尝试这样的操作:
for ii in range(len(combine)):
combine[ii] = combine[ii].drop(['Ticket', 'Cabin'], axis=1)
现在您正在更改列表中的变量,而不仅仅是副本。