首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Pandas中优化字符串匹配

在Pandas中优化字符串匹配
EN

Stack Overflow用户
提问于 2018-08-23 19:23:17
回答 2查看 264关注 0票数 0

目前,我有下面这行代码,我尝试在我的pandas列中进行字符串匹配:

input_supplier = input_supplier[input_supplier['Category Level - 3'].str.contains(category, flags=re.IGNORECASE)]

但是,此操作需要很长时间。熊猫df的大小是:(8098977, 16)

有什么方法可以优化这个特殊的操作吗?

EN

回答 2

Stack Overflow用户

发布于 2018-08-23 21:29:18

就像Josh Friedlander说的那样,它应该更快一点,添加一个列,然后过滤:

len(df3)

9599904

# Creating a column then filtering
start_time = time.time()
search = ['Emma','Ryan','Gerald','Billy','Helen']
df3['search'] = df3['First'].str.contains('|'.join(search))
new_df = df3[df3['search'] == True]
end_time = time.time()
print(f'Elapsed time was {(end_time - start_time)} seconds')

Elapsed time was 6.525546073913574 seconds

只是在做一个str.contains:

start_time = time.time()
search = ['Emma','Ryan','Gerald','Billy','Helen']
input_supplier = df3[df3['First'].str.contains('|'.join(search), flags=re.IGNORECASE)]
end_time = time.time()
print(f'Elapsed time was {(end_time - start_time)} seconds')

Elapsed time was 11.464462518692017 seconds

创建一个新列并对其进行过滤大约是对str.contains()进行过滤的两倍。

票数 1
EN

Stack Overflow用户

发布于 2018-08-24 00:21:07

在将搜索列值和类别列表值转换为小写后,使用快速numpy "where“和"isin”函数。如果列和/或类别列表包含非字符串,请先转换为字符串。如果希望将原始数据框中的所有列都索引到搜索列结果中,请删除最后一行中的列标签。

import numpy as np
import pandas as pd
import re

names = np.array(['Walter', 'Emma', 'Gus', 'Ryan', 'Skylar', 'Gerald',
                  'Saul', 'Billy', 'Jesse', 'Helen'] * 1000000)
input_supplier = pd.DataFrame(names, columns=['Category Level - 3'])

len(input_supplier)
10000000

category = ['Emma', 'Ryan', 'Gerald', 'Billy', 'Helen']

方法1(注意此方法不会忽略大小写)

%%timeit
input_supplier['search'] = \
    input_supplier['Category Level - 3'].str.contains('|'.join(category))
df1 = input_supplier[input_supplier['search'] == True]

4.42 s ± 37.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

方法2

%%timeit
df2 = input_supplier[input_supplier['Category Level - 3'].str.contains(
    '|'.join(category), flags=re.IGNORECASE)]

5.45 s ± 25.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

忽略大小写的Numpy方法:

%%timeit
lcase_vals = [x.lower() for x in input_supplier['Category Level - 3']]
category_lcase = [x.lower() for x in category]
df3 = input_supplier.iloc[np.where(np.isin(lcase_vals, category_lcase))[0]]

2.02 s ± 31.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

匹配大小写时的Numpy方法:

%%timeit
col_vals = input_supplier['Category Level - 3'].values
df4 = input_supplier.iloc[np.where(np.isin(col_vals, category))[0]]

623 ms ± 1.12 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51984673

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档