Python 按列名称列出的数据帧子集列表

Python 按列名称列出的数据帧子集列表,python,pandas,Python,Pandas,因此,我有一个数据帧列表df_list=[df1,df2,df3]和一个我感兴趣的列标题列表颜色列表=[“火”、“水”、“风”、“雹”] 我想循环遍历每个数据框df_列表,并创建一个新的数据框,其中只包含col_列表中的列。问题是,如果col_列表中的一个元素不在df中,我仍然希望它生成数据框,但不包含该列 我试着做的是 for data_frame in df_list: try: data_frame=data_frame[['Fire','Water','Wind','

因此,我有一个数据帧列表
df_list=[df1,df2,df3]
和一个我感兴趣的列标题列表<代码>颜色列表=[“火”、“水”、“风”、“雹”]

我想循环遍历每个数据框df_列表,并创建一个新的数据框,其中只包含col_列表中的列。问题是,如果col_列表中的一个元素不在df中,我仍然希望它生成数据框,但不包含该列

我试着做的是

for data_frame in df_list:
   try:
       data_frame=data_frame[['Fire','Water','Wind','Hail']]
   except:
        continue

但是,这并没有给出我想要的结果。

您可以使用列表理解来获取
列列表中的列的子集。但是,当您进行迭代时,
data\u frame
var只有一个对对象的引用,更改它实际上不会更改数组中的元素。您可以保留另一个带有“子数据帧”的列表

编辑:

正如在另一个答案中指出的,你可以把它作为一个单一的列表来理解。。。这对眼睛来说有点难:

sub_df_list = [
    data_frame[[col for col in data_frame.columns if col in col_list]]
    for data_frame in df_list
]
编辑2:

熊猫列是一个
索引
对象。这些都设置了操作,例如
交叉点
。做你想做的事情最简单的方法是:

sub_df_list = [
    data_frame[data_frame.columns.intersection(col_list)] for data_frame in df_list
]

您应该使用列表理解:

[data_frame[['Fire','Water','Wind','Hail']] for data_frame in df_list]
如果某些数据框没有您可以使用的所有列:


在for循环中:

data_frame=data_frame[['Fire','Water','Wind','Hail']]
正在覆盖数据帧变量,但不更新df\U列表的第i项。
这相当于以下代码:

In [11]: a = [1, 2, 3]

In [12]: for i in a:
    ...:     i = i + 1
    ...:

In [13]: a
Out[13]: [1, 2, 3]

有点不清楚你在问什么。您可以添加一个包含两个最小输入数据帧的列表和一个您想要的输出示例吗?这是如何解决不同列的OPs问题的?此外,我不明白为什么列表理解有助于解决这个问题。@Markus,因为您将在生成的列表上使用pd.concat。我的假设是OP的其余代码都是这样做的。@Markus“我想循环遍历每个数据帧df_列表,并创建一个新的数据帧,其中只包含col_列表中的列。”@Markus你说得很好,谢谢!在这些情况下,您应该使用reindex。@Bjc51192它得到NaN,如果这还不够,您可以填写Na(1):)我认为您的第二次编辑是最好的(也是最可读的)解决方案。
data_frame=data_frame[['Fire','Water','Wind','Hail']]
In [11]: a = [1, 2, 3]

In [12]: for i in a:
    ...:     i = i + 1
    ...:

In [13]: a
Out[13]: [1, 2, 3]