使用 List Comprehension (Pandas) 从 DataFrames 列表中删除 DataFrames 列

Posted

技术标签:

【中文标题】使用 List Comprehension (Pandas) 从 DataFrames 列表中删除 DataFrames 列【英文标题】:Drop columns of DataFrames from a list of DataFrames using List Comprehension (Pandas) 【发布时间】:2017-12-25 06:05:34 【问题描述】:

我有一个具有相同列和不同值的 DataFrame 列表。我想在 pandas 的一行中从 DataFrames 列表中删除一些列。

到目前为止,我试过了(dfs 有数据框列表)

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)]

两者都给出相同的错误:

AttributeError: 'list' 对象没有属性 'drop'

type(dfs)
>> list

但是,当我可以使用for 循环遍历列表dfs 中的每个DataFRame 时,我可以删除这些列。

如何以熊猫的列表理解方式做到这一点?

【问题讨论】:

但是dfs 是列表,而不是单个数据框。 列表推导式不是解决这个问题的惯用方法。 dfs 是一个数据帧列表 @COLDSPEED 好的,我想知道我是否可以在列表理解中做。谢谢建议,我会继续使用常规的for循环 @i.n.n.m 并不是说​​你做不到……你可以。但为什么呢? 【参考方案1】:

假设您要删除 ['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。

【讨论】:

@AdarshChavakula 在使用可变对象(如数据框)时,您直接使用的是引用,而不是副本。它确实有效。 作为练习,创建df,然后将df 分配给df1。尝试在df1 中删除一列,更改也会反映在df 中。 @COLDSPEED 谢谢,dfs = [df.drop(['var1', 'var2'], axis=1) for df in dfs] 列表理解方式工作得很好:) @i.n.n.m 我仍然站在循环中,但是,嘿,不管工作如何完成,对吧? ;) 给你更多的力量。 inplace=True 的名称具有误导性——在内部,该方法创建了一个新的(子)DataFrame,然后调用_update_inplace,它将生成的DataFrame 的_data 复制回调用DataFrame 的_data 属性. inplace=True 选项保持向后兼容性,但由于其误导性,probably should not recommended for use going forward。

以上是关于使用 List Comprehension (Pandas) 从 DataFrames 列表中删除 DataFrames 列的主要内容,如果未能解决你的问题,请参考以下文章

使用 List Comprehension (Pandas) 从 DataFrames 列表中删除 DataFrames 列

[Python]List Comprehension

Python List comprehension列表推导式

在Scala中使用for comprehension时修改列表

Go+ 列表解析 list comprehension

Go+ 列表解析 list comprehension