根据列名中的字符串列表筛选大型Pandas DataFrame



堆栈溢出系列,

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

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

在这里寻求一些指导。谢谢你抽出时间。

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

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

或者,您可以只匹配列表中以子字符串开头的列:

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

编辑:考虑到我以前解决方案的时间复杂性,我想出了一种使用列表理解的方法:

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)]

输出:['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()

并在所有列名上应用正则表达式,以获得与字符串列表匹配的所有列名,并应用与上述相同的代码

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

最新更新