我正在尝试找出使用“for 循环”循环遍历多个 Pandas 数据帧的正确方法。所有这些都包含从 1960 年到 2016 年的“年份”列,并且我想从每个 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)
2 回答
米脂
TA贡献1836条经验 获得超3个赞
对于循环中的人来说,这是一个常见的问题。当你说
for df in dflist:
然后更改df,更改不会发生在列表中的实际对象上,只是为了 df
使用enumerate
以修复
for i,df in enumerate(dflist): dflist[i]=df.drop(dfnewlist,axis=1)
GCT1015
TA贡献1827条经验 获得超4个赞
为了确保一些稳健性,您可以使用errors='ignore'
标志,以防万一列不存在,drop 不会出错。
但是,您真正的问题是,当您循环时,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)
添加回答
举报
0/150
提交
取消