如何使用for循环一次更改多个熊猫数据帧

时间:2018-11-29 01:26:42

标签: python pandas dataframe for-loop

我有两个结构几乎相同的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”的两个副本,即“组合”列表中的两个副本和外部的“副本”。我需要做些什么来使这些更改持续存在吗?

这似乎应该是如此简单,并且让我发疯了!

2 个答案:

答案 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]