因此,我有一个数据帧列表df_list=[df1,df2,df3]
和一个我感兴趣的列标题列表。col_list=['Fire','Water','Wind','Hail']
我想遍历每个数据框df_list,并仅在col_list中的列创建一个新的数据框。问题是,如果col_list中的元素之一不在df中,我仍然希望它制作数据框,但是简单地没有该列。
我尝试做的是
for data_frame in df_list:
try:
data_frame=data_frame[['Fire','Water','Wind','Hail']]
except:
continue
但是,这不能给出我想要的结果。
答案 0 :(得分:1)
您可以使用列表推导来获取col_list
中col的子集。但是,当您进行迭代时,data_frame
var仅具有对对象的引用,对其进行更改实际上不会更改数组中的元素。您可以保留带有“子数据帧”的另一个列表。
sub_df_list = []
for data_frame in df_list:
sub_df_list.append(
data_frame[[col for col in data_frame.columns if col in col_list]]
)
编辑:
在另一个答案中指出,您可以将其作为单个列表理解来完成...这在您看来有点困难:
sub_df_list = [
data_frame[[col for col in data_frame.columns if col in col_list]]
for data_frame in df_list
]
编辑2:
Pandas列是Index
对象。这些已设置操作,例如intersection
。做你想做的最简单的方法是:
sub_df_list = [
data_frame[data_frame.columns.intersection(col_list)] for data_frame in df_list
]
答案 1 :(得分:1)
您应该使用列表理解:
[data_frame[['Fire','Water','Wind','Hail']] for data_frame in df_list]
如果某些data_frames没有所有列,则可以改用reindex:
[data_frame.reindex(columns=['Fire','Water','Wind','Hail']) for data_frame in df_list]
在for循环中:
data_frame=data_frame[['Fire','Water','Wind','Hail']]
正在覆盖data_frame变量,但不会更新df_list的第i个项目。
这等效于以下代码:
In [11]: a = [1, 2, 3]
In [12]: for i in a:
...: i = i + 1
...:
In [13]: a
Out[13]: [1, 2, 3]