我有一个DataFrame列表,它们都有列['a','b','c']:
list_ = [df1, df2, df3]
并希望运行以下循环:
for lst in list_:
lst['x'] = 'abc'
lst = lst[['a', 'x']]
当我打印list_ [0]时,我看到新列'x',但也看到所有其他列。为什么循环中的第一行被执行但第二行没有?
答案 0 :(得分:2)
第一行在原始数据引用上就地操作。但是,第二行使用原始数据中的切片重新分配变量lst
,但此分配不会修改原始数据框,因为现在只有(临时)名称lst
指向不同的数据。
一种解决方案:
def fix(lst):
lst['x'] = 'abc'
lst = lst[['a', 'x']]
return lst
list_ = [fix(lst) for lst in list_]
或者基于就地删除列的没有列表理解的解决方案:
s = ['a', 'x']
for lst in list_:
lst['x'] = 'abc'
lst.drop([c for c in lst.columns if c not in s], axis=1, inplace=True)