使用列表推导式(Pandas),从DataFrame列表中删除列。

5
我有一组拥有相同列但不同值的DataFrame列表。我希望在pandas中一行代码中从DataFrame列表中删除某些列。
目前,我已经尝试过以下方法(dfs 是一个 DataFrame 列表):
dfs.drop([col for col in ['var1', 'var2'] if col in dfs], axis=1, inplace=True)

并且。
dfs[dfs.drop([col for col in ['var1', 'var2'] if col in dfs], axis=1, inplace=True)]

两者都显示相同错误:

属性错误:'list'对象没有'drop'属性

type(dfs)
>> list

然而,当我使用for循环遍历列表dfs中的每个DataFrame时,我可以删除列。

我该如何在Pandas中使用列表推导式实现相同的功能?


但是 dfs 是一个列表,而不是单个数据帧。 - Willem Van Onsem
2
列表推导式不是解决这个问题的惯用方式。 - cs95
dfs 是一个 DataFrame 的列表。 - i.n.n.m
@COLDSPEED 好的,我在想能否使用列表推导式来完成。感谢您的建议,我将继续使用常规的 for 循环。 - i.n.n.m
@i.n.n.m 不是你不能做到... 你是可以的。但是为什么呢? - cs95
@COLDSPEED 因为我在 dfs 中有大约20个不同的数据框,我想查看一些包含我感兴趣的变量('var3','var4')的数据框,同时删除其他的变量('var1','var2')。然后我会删除 var3 并将其余的数据框放在一起。这就是为什么我想从 dfs 中的数据框中删除一些列的原因。 - i.n.n.m
1个回答

8
假设您想要删除['var1', 'var2']列,并且您的数据框具有相同的列,您应该使用for循环。
for df in dfs:
    df.drop(['var1', 'var2'], axis=1, inplace=True)

另外,您还可以使用以下方法:

dfs = [df.drop(['var1', 'var2'], axis=1) for df in dfs]

没有指定 inplace=True 会导致 df.drop 返回一个 新的 数据框,而不是就地更新并返回 None。

1
@AdarshChavakula 当使用像数据框这样的可变对象时,您直接使用引用而不是副本进行操作。它确实有效。 - cs95
1
作为练习,创建 df,然后将 df 分配给 df1。尝试在 df1 中删除一列,更改也会反映在 df 中。 - cs95
1
@COLDSPEED 谢谢,dfs = [df.drop(['var1', 'var2'], axis=1) for df in dfs] 列表推导式的方式完美地解决了问题 :) - i.n.n.m
1
@i.n.n.m 我仍然坚持使用循环,但是嘿,无论用什么方法完成工作都可以,对吧? ;) 给你更多的力量。 - cs95
1
inplace=True 的命名有误导性 - 在内部,该方法创建一个新的(子)DataFrame,然后调用 _update_inplace,将结果DataFrame的 _data 复制回调用DataFrame的 _data 属性。 inplace=True 选项为了向后兼容而存在,但由于其具有误导性,可能不建议在未来使用 - unutbu
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接