数据框的子集列表(按列名)

时间:2019-05-28 21:35:22

标签: python pandas

因此,我有一个数据帧列表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

但是,这不能给出我想要的结果。

2 个答案:

答案 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]