Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于列名中的字符串列表筛选大数据帧_Python_Pandas_Data Analysis - Fatal编程技术网

Python 基于列名中的字符串列表筛选大数据帧

Python 基于列名中的字符串列表筛选大数据帧,python,pandas,data-analysis,Python,Pandas,Data Analysis,堆栈溢出族 我最近开始学习Python,并使用Pandas处理一些工厂数据。csv文件本质上是一个大数据帧(1621行×5633列)。虽然我需要所有的行,因为它们是每个单元的数据,但我需要过滤许多不需要的列。我已经在这些列名中确定了一个字符串列表,我可以使用它只查找所需的列,但是,我无法确定这里的好逻辑是什么或任何内置python函数 dropna对我来说不是一个选项,因为其中一些想要的列具有NA作为值(例如test limit) 对于包含所有NA的列,dropna也不够好,因为我最终仍然会有大

堆栈溢出族

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

dropna对我来说不是一个选项,因为其中一些想要的列具有NA作为值(例如test limit) 对于包含所有NA的列,dropna也不够好,因为我最终仍然会有大量的列

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

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

输出:
[‘苹果’、‘香蕉’]

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

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\u cols=current\u df.columns.tolist()


并对所有列名称应用正则表达式,以获取与字符串列表匹配的所有列名称,并应用与上面相同的代码。您可以通过使用正则表达式应用字符串包含从数据帧中删除列。下面是一个例子
drop(df.columns[df.columns.str.contains(“^abc”)],axis=1)

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

df.filter(regex='|'.join(cols_subset), axis=1)
或者,您可以只匹配列表中以子字符串开头的列:

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


谢谢你,罗斯赫蒂。这对我不起作用,因为想要的列名只是字符串的一部分,而不是整个列名。拥有完整的列名是不可行的,因为这些名称总是在变化,因此只是字符串的一部分。你能就你的数据给出一个简单的例子,说明你想说什么吗?当然可以,@roshshetty。我们可以忘记行,因为我需要所有行。这些都是我必须用来绘制Cpk、分布等的数字。例如,对于列,我有一些字符串,如测试仪、测试站、测试初始化、测试初始化周期时间、SW闪存、SW闪存周期时间电池充电、电池充电周期时间、电池充电重试等。在本例中,我只需要电池充电柱,需要过滤掉其余的。当然,我有更多这样的专栏,这就是为什么我把关键字放在一个列表中。我明白你现在想说什么。我为这篇文章做了必要的编辑,符合你所说的标准。如果我仍然误解它,你可以纠正我。这个解决方案适用于我的情况,它还处理我遇到的独特场景,可能需要在正则表达式中进行一些额外处理。请显示带有预期输出的示例输入数据帧,以便更好地理解。谢谢@Netim。我有你建议的所有列名的列表。但我不确定是否从这里开始,根据我可以使用的字符串列表对它们进行过滤。如果我有一个字符串列表(这只是通缉列名称的一部分),正如@Venkat建议的那样,我应该如何使用regex?你可以这样做
regex\u rule\u from\u list=''124;'。加入(你的字符串列表)
然后使用
df.drop(df.columns[df.columns.str.contains(regex\u rule\u from\u from\u list)],axis=1)
我一定会很快尝试的,现在想了解更多关于正则表达式的信息!谢谢你,@Venkat。如果我想用你的例子,那么有可能在我识别的字符串列表上应用正则表达式吗?是的,你可以准备一个正则表达式并检查它是否与你在这里的列@或任何类似的网站相匹配。你可以在任何示例数据框上应用此逻辑并检查结果。好的luckHaven还没有尝试过这一点,但我一定会尝试一下,了解它是如何工作的。谢谢。我尝试了筛选选项,但由于我使用的是列表,因此无法执行我想要执行的操作。需要深入研究regex操作,谢谢@filippoThank,谢谢@filippo。你的解释很完美,我用它来过滤我的数据集。我现在对正则表达式有了更多的了解,仍然是Python的新手——因此我学习了编写高效代码的艺术。我想更新一些我观察到的会扰乱我选择的东西。希望在仍然使用正则表达式的情况下有办法解决这个问题。下面是我看到的:我的四个列名是6.3相邻-10MHz,6.3相邻+10MHz,6.3相邻-7.5MHz,6.3相邻+7.5MHz。使用正则表达式,它似乎无法区分-10MHz和+10MHz列,而是在-10MHz之后跳到-7.5MHz。这将导致比我期望看到的更少的列。有没有想过我该如何处理这种情况?PS:roshshetty解决方案按预期工作,已验证。@VinayGHegde没问题,使用实际解决问题的解决方案;-)我需要查看您试图匹配的子字符串,以了解错误所在。实际上,我使用整个名称作为字符串来匹配这四列(其他一些列的名称较长,我使用子字符串)
df.filter(regex='^('+'|'.join(cols_subset)+')', axis=1)