我正在尝试找到一种正确的方法,使用“ for循环”在多个熊猫数据帧之间循环。它们都包含从1960年到2016年的'year'列,我想从每个df中删除'1960'到'1995'列。
我创建了dfs列表以及这些年的str值列表。
dflist = [apass,rtrack,gdp,pop]
dfnewlist =[]
for i in range(1960, 1996):
dfnewlist.append(str(i))
for df in dflist:
df = df.drop(dfnewlist, axis = 1)
我的for循环运行没有错误,但是没有删除列。
编辑-只是添加一下,当我手动执行此操作而没有for循环时,如下所示,它工作正常:
gdp = gdp.drop(dfnewlist, axis = 1)
答案 0 :(得分:2)
这是for循环中常见的问题。当你说
for df in dflist:
然后更改df,更改不会发生在列表中的实际对象上,仅发生在df
使用enumerate
进行修复
for i,df in enumerate(dflist):
dflist[i]=df.drop(dfnewlist,axis=1)
答案 1 :(得分:0)
为确保某些功能的可靠性,您可以使用errors='ignore'
标志,以防万一其中一列不存在,删除操作不会出错。
但是,您真正的问题是循环时,df
首先引用列表中的内容。但是随后您通过将df
的结果分配给名称df.drop(dfnewlist, axis=1)
来覆盖该名称。这不会不替换您列表中的数据框,但会创建一个新名称df
,该名称不再指向列表中的项目。
相反,您可以使用inplace=True
标志。
drop_these = [*map(str, range(1960, 1996)]
for df in dflist:
df.drop(drop_these, axis=1, errors='ignore', inplace=True)