繁体   English   中英

当列表元素可能或可能不作为列存在时,使用给定列表从 Pandas Dataframe 中过滤列

[英]Filter Columns from Pandas Dataframe with given list when list elements may or may not be present as column

我有一个巨大的数据框,如果给定列表中存在列,我需要从数据框中过滤掉这些列。

例如,

df = pd.DataFrame([[1,2,3,4,5],[6,7,8,9,10]], columns=list('ABCDE'))

这是数据框。

   A  B  C  D   E
0  1  2  3  4   5
1  6  7  8  9  10

我有一个清单。

fil_lst = ['A', 'D', 'F']

该列表可能包含数据框中不存在的列名。 我只需要数据框中存在的列。

我需要生成的数据框,例如,

   A  D
0  1  4
1  6  9

我知道它可以在列表理解的帮助下完成,例如,

new_df = df[[col for col in fil_lst if col in df.columns]]

但是由于我有一个巨大的数据框,如果我不使用这个计算成本高的过程会更好。 是否可以以任何方式对其进行矢量化?

使用Index.isin在列和测试会员DataFrame.loc用于过滤器按列,所以:平均选择由掩码中的所有行和列:

fil_lst = ['A', 'D', 'F']
df = df.loc[:, df.columns.isin(fil_lst)]
print(df)
   A  D
0  1  4
1  6  9

或使用Index.intersection

fil_lst = ['A', 'D', 'F']
df = df[df.columns.intersection(fil_lst)]
print(df)
   A  D
0  1  4
1  6  9

如果您正在处理大型列表,并且重点是性能而不是列的顺序,则可以使用set intersection

In [2944]: fil_lst = ['A', 'D', 'F']
In [2945]: col_list = df.columns.tolist()

In [2947]: df = df[list(set(col_list) & set(fil_lst))]

In [2947]: df
Out[2947]: 
   D  A
0  4  1
1  9  6

编辑:如果列的顺序很重要,请执行以下操作:

In [2953]: df = df[sorted(set(col_list) & set(fil_lst), key = col_list.index)]

In [2953]: df
Out[2953]: 
   A  D
0  1  4
1  6  9

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM