Pandas多个查找字符串

时间:2018-06-13 14:58:57

标签: python string python-3.x pandas series

我正在编写一个脚本来读取和处理Excel文件中的数据,我需要过滤包含多个字符串的行。

目前,过滤方法是针对每种类型的Excel工作表进行硬编码的(每种工作表类型都有一个子类,它继承自处理读取文件和第一次处理的父项),我正在阅读,但是由于我需要分析的纸张数量正在增长,这变得非常繁琐,我正在寻找更优雅的解决方案。

现在,我已经实现了这样:

def _find(self,find_str,column='Data1'):
    return (self.df[column].str.find(find_str) > -1)
def filter(self):
    self.df_filter = self.df[(self._find('This') | self._find('is')) 
                           & self._find('an') | self._find('example')]

为每个子类使用重新实现的过滤器方法。偶尔逻辑(实际上是二进制)表达式会变得很长。

是否有一致,可读的方法来缩短这个? 我想到了将类似逻辑表达式的对象传递给广义过滤器函数的行,如

gen_find(('This' | 'is') & 'an' | 'example')

(我知道这可能是一个坏主意,但你明白了)

1 个答案:

答案 0 :(得分:0)

pd.Series.str.find(x) > -1相当于pd.Series.str.contains(x)。两者都给出了布尔系列,您可以使用它来过滤数据帧。简化逻辑的一种方法是将正则表达式与pd.Series.str.contains一起使用。

例如,定义您要查找的子字符串列表:

L = ['This', 'is', 'an', 'example']

然后将它们组合在一个正则表达式中。如果您有需要转义的字符,请使用re.escape

import re
regexp = '|'.join([re.escape(i) for i in L])

最后,将此表达式合并到系列掩码中:

df = df[df['col'].str.contains(regexp)]

您可以将多个or条件与&运算符结合使用:

mask1 = df['col'].str.contains(regexp1)
mask2 = df['col'].str.contains(regexp2)

df = df[mask1 & mask2]