繁体   English   中英

根据列名中的字符串列表过滤大型 Pandas DataFrame

[英]Filtering a large Pandas DataFrame based on a list of strings in column names

堆栈溢出家庭,

我最近开始学习 Python 并且正在使用 Pandas 来处理一些工厂数据。 csv 文件本质上是一个大型 dataframe(1621 行 × 5633 列)。 虽然我需要所有行,因为这些是每个单元的数据,但我需要过滤许多不需要的列。 我已经在这些列名中确定了一个字符串列表,我可以使用它来仅查找所需的列,但是,我无法弄清楚这里的逻辑是什么或任何内置的 python 函数。

dropna 对我来说不是一个选项,因为其中一些想要的列具有 NA 作为值(例如测试限制),对于所有 NA 的列的 dropna 也不够好,因为我仍然会得到大量列。

在这里寻找一些指导。 感谢您的时间。

编辑:鉴于我之前的解决方案的时间复杂度,我想出了一种使用列表理解的方法:

fruits = ["apple", "banana", "cherry", "kiwi", "mango"]
app = ["app", "ban"]
new_list = [x for x in fruits if any(y in x for y in app)]

output: ['apple', 'banana']

这应该只显示您需要的列。 在您的情况下,您只需要执行以下操作:

my_strings = ["A", "B", ...]
new_list = [x for x in df.columns if any(y in x for y in my_strings)]
print(new_list)

如果您确切地知道列名,那么您可以做的是这样的事情:

unwanted_cols = ['col1', 'col4'] #list of unwanted cols names

df_cleaned = current_df.drop(unwanted_cols, axis=1)

# or 

current_df.drop(unwanted_cols, inplace=True, axis=1)

如果您不确切知道列名,您可以首先检索所有列

all_cols = current_df.columns.tolist()

并对所有列名应用正则表达式,以获取与您的字符串列表匹配的所有列名并应用与上面相同的代码

您可以通过应用字符串包含正则表达式从 dataframe 删除列。 下面是一个例子 df.drop(df.columns[df.columns.str.contains('^abc')], axis=1)

如果您有有效列的列表,则可以使用df.filter(cols_subset, axis=1)删除其他所有内容。 您可以使用正则表达式来匹配列名中列表中的子字符串:

df.filter(regex='|'.join(cols_subset), axis=1)

或者,您可以仅匹配列表中以 substring 开头的列:

df.filter(regex='^('+'|'.join(cols_subset)+')', axis=1)

暂无
暂无

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

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