使用 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列表推导式