我有一个数据框列表:
df_list = [df1,df2,df3,df4]
我想只选择其中一些列,例如:
df1 = df1[['column_a','column_e','column_wa']]
但我想在循环中进行此操作
for df in df_list:
df = df[['column_a','column_e','column_wa']]
但在循环结束时,每个数据框都具有与之前相同的列。
答案 0 :(得分:1)
在每次循环迭代中,df
绑定到DataFrame。在操作(选择一些列)之后,将形成一个新的DataFrame,df
将绑定到它。那里没有任何东西可以修改原始列表。
然而,这是一种方法。假设你从这样的事情开始:
dfs = [pd.DataFrame({'a': [1], 'b': [1], 'c': [1], 'd': [1]}) for _ in range(3)]
您可以使用简单的comprehensions来完成您的要求:
dfs = [df[['a', 'b']] for df in dfs]
例如,注意:
>>> dfs[0]
a b
0 1 1
答案 1 :(得分:1)
您创建没有字段的数据框副本 - 您不会更改原始数据框
使用:
del df['column']
从原始DataFrame中删除列
修改强> DataFrame.drop允许您在一个命令中删除多个列:
df.drop(['column_a','column_e','column_wa'], inplace=True, axis=1)
答案 2 :(得分:1)
此方法会修改每个原始数据帧。
cols_retained = ['column_a','column_e','column_wa']
_ = [df.drop([c for c in df if c not in cols_retained], axis='columns', inplace=True)
for df in df_list]
[c for c in df if c not in cols_retained]
会生成该数据框中不在cols_retained
中的所有列的列表。即使其中一个数据帧没有cols_retained
中的所有列,此方法也会起作用(如果不需要,可以很容易地添加条件以确保过滤后的数据帧各自具有适当的列数)