在pandas数据帧上查找特定正则表达式匹配的列和行索引

时间:2018-02-05 18:57:06

标签: python regex pandas

我们说我的小区中有一个带有字符串内容的pandas数据帧。

找到与特定正则表达式匹配的字符串然后返回带有各自行和列索引的元组列表的最佳方法是什么?

即,

import pandas as pd
mydf = pd.DataFrame({'a':['hello', 'world'], 'b': ['hello', 'folks']})

def findIndex(mydf, regex):
    return regex_indexes

如果我这样做:

regex = r"hello"
findIndex(mydf, regex) # it'd return [(0,0), (0,1)],

如果我这样做:

regex = r"matt"
findIndex(mydf, regex) # it'd return [(-1,-1)],

如果我这样做:

regex = r"folks"
findIndex(mydf, regex) # it'd return [(1,1)], 

我可以在pd.DataFrame做一个双循环,但想知道其他想法是否更好......

1 个答案:

答案 0 :(得分:2)

您可以尝试使用applystr.matchnonzero

def findIdx(df, pattern):
    return df.apply(lambda x: x.str.match(pattern)).values.nonzero()

findIdx(mydf, r"hello")
(array([0, 0]), array([0, 1]))
  • df.apply(lambda x: x.str.match(pattern)).values会返回df相同大小的数组,其中True表示匹配,否则为False

  • 然后我们使用nonzero查找1True)部分的索引。

它将返回与数组元组中的模式匹配的索引。如果你需要 一个元组列表,使用list(zip(*findIdx(mydf, r"hello")))

[(0, 0), (0, 1)] 

np.transpose(findIdx(mydf, r"hello"))

如果在找不到任何内容时需要返回None,可以尝试

def findIdx(df, pattern):
    ret = df.apply(lambda x: x.str.match(pattern)).values.nonzero()
    return None if len(ret[0]) == 0 else ret

注意:str.match在钩子下使用re.match。它将匹配此示例函数中pattern 开头的字符串。如果想要查找字符串是否包含pattern作为子字符串,请使用str.contains而不是str.match