Python - 矢量化正则表达式搜索以进行分类

时间:2017-02-19 20:00:18

标签: python regex pandas dataframe

我有一个标识符函数,它遍历DataFrame列中的所有元素,然后为它们分配一个类别。我现在的代码现在看起来像这样;

def fruit_replace(x):
    fruit_quantity = re.search(r'(\\d+)quantity', x)
    if 'apple' in x:
        return 'green'
    elif 'pear' in x:
        return 'green'
    elif 'cherry' in x:
        return 'red'
    elif 'banana' in x:
        return 'yellow'
    elif fruit_quantity != None:
        return fruit_quantity.group(0)

我在DataFrame上的lambda函数中应用它,并将结果分配给新列。不幸的是,由于fruit_quantity搜索与其他搜索不同,它有点复杂。

这个过程应该产生这样的东西;

原始DataFrame

pd.DataFrame({'fruit_type': ['big apple', 'small cherry', 'jerry 10quantity']})

进入这个

pd.DataFrame({'fruit_type': ['big apple', 'small cherry', 'peach 10quantity'],
              'category': ['green', 'red', 10]})

我的问题是,这个代码是否可以用pythonic或pandas方式改进,并且可能是矢量化的?我必须将其应用于大约500万行,这需要一些时间。

非常感谢!

1 个答案:

答案 0 :(得分:1)

您可以将boolean indexingstr.contains()方法结合使用:

df['category'] = np.nan

df.loc[df.fruit_type.str.contains(r'\b(?:apple|pear)\b'), 'category'] = 'green'
df.loc[df.fruit_type.str.contains(r'\b(?:cherry)\b'), 'category'] = 'red'
df.loc[df.fruit_type.str.contains(r'\b(?:banana)\b'), 'category'] = 'yellow'
df.loc[df['category'].isnull() & (df.fruit_type.str.contains(r'\d+q')), 'category'] = \
    df.fruit_type.str.extract(r'(\d+)q', expand=False)

结果:

In [270]: df
Out[270]:
         fruit_type category
0         big apple    green
1      small cherry      red
2  jerry 10quantity       10