我有两个结构几乎相同的DataFrame,我想同时对其执行数据转换/清理。为此,我创建了一个包含这两个DF的列表,并遍历该列表。
例如:
train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')
combined = [train, test]
for dataset in combined:
dataset = dataset.drop(['Age'], axis =1)
print(dataset.head())
for 循环中的最终打印语句可以正常工作-删除了“年龄”列。但是,如果我立即调用 train.head(),则被删除的列仍将存在于DataFrame中。几乎好像正在创建“ train”和“ test”的两个副本,即“组合”列表中的两个副本和外部的“副本”。我需要做些什么来使这些更改持续存在吗?
这似乎应该是如此简单,并且让我发疯了!
答案 0 :(得分:0)
您将在每个循环中创建一个新的数据集变量,并对它们执行操作。因此,正如您所说的,您确实是在创建培训和测试的副本。您想要的是drop
inplace
列,而不是重新分配:
train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')
combined = [train, test]
for dataset in combined:
dataset.drop(['Age'], axis = 1, inplace=True)
# print(dataset.head())
请注意,另一种解决方案是在load them时忽略这些列:
train = pd.read_csv('train.csv', usecols=lambda x: x!='Age')
test = pd.read_csv('test.csv', usecols=lambda x: x!='Age')
答案 1 :(得分:0)
除了@sacul的答案,还有其他更常见的方式来修改列表中的值,例如:
lst = [1,2,3,4] # any list
for i, elem in enumerate(lst):
lst[i] = elem + 1 # can be any method here
lst
Out[24]: [2, 3, 4, 5]