gpt4 book ai didi

python - Pandas Dataframe 使用正则表达式检查值是否存在

转载 作者:太空狗 更新时间:2023-10-30 01:56:34 25 4
gpt4 key购买 nike

我有一个大数据框,我想检查是否有任何单元格包含 admin 字符串。

   col1                   col2 ... coln
0 323 roster_admin ... rota_user
1 542 assignment_rule_admin ... application_admin
2 123 contact_user ... configuration_manager
3 235 admin_incident ... incident_user
... ... ... ... ...

我尝试使用 df.isin(['*admin*']).any() 但似乎 isin 不支持正则表达式。如何使用正则表达式搜索所有列?

我避免使用循环,因为数据框包含超过 1000 万行和许多列,效率对我来说很重要。

最佳答案

有两种解决方法:

  1. df.col.apply 方法更直接但也有点慢:

    In [1]: import pandas as pd

    In [2]: import re

    In [3]: df = pd.DataFrame({'col1':[1,2,3,4,5], 'col2':['admin', 'aa', 'bb', 'c_admin_d', 'ee_admin']})

    In [4]: df
    Out[4]:
    col1 col2
    0 1 admin
    1 2 aa
    2 3 bb
    3 4 c_admin_d
    4 5 ee_admin

    In [5]: r = re.compile(r'.*(admin).*')

    In [6]: df.col2.apply(lambda x: bool(r.match(x)))
    Out[6]:
    0 True
    1 False
    2 False
    3 True
    4 True
    Name: col2, dtype: bool

    In [7]: %timeit -n 100000 df.col2.apply(lambda x: bool(r.match(x)))
    167 µs ± 1.02 µs per loop (mean ± std. dev. of 7 runs, 100000 loops each)

  1. np.vectorize 方法需要 import numpy,但效率更高(在我的 timeit 测试中大约快 4 倍)。

    In [1]: import numpy as np

    In [2]: import pandas as pd

    In [3]: import re

    In [4]: df = pd.DataFrame({'col1':[1,2,3,4,5], 'col2':['admin', 'aa', 'bb', 'c_admin_d', 'ee_admin']})

    In [5]: df
    Out[5]:
    col1 col2
    0 1 admin
    1 2 aa
    2 3 bb
    3 4 c_admin_d
    4 5 ee_admin

    In [6]: r = re.compile(r'.*(admin).*')

    In [7]: regmatch = np.vectorize(lambda x: bool(r.match(x)))

    In [8]: regmatch(df.col2.values)
    Out[8]: array([ True, False, False, True, True])

    In [9]: %timeit -n 100000 regmatch(df.col2.values)
    43.4 µs ± 362 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

由于您已将问题更改为检查任何单元格,并且还关注时间效率:

# if you want to check all columns no mater what `dtypes` they are
dfs = df.astype(str, copy=True, errors='raise')
regmatch(dfs.values) # This will return a 2-d array of booleans
regmatch(dfs.values).any() # For existence.

您仍然可以使用 df.applymap 方法,但同样,它会更慢。

dfs = df.astype(str, copy=True, errors='raise')
r = re.compile(r'.*(admin).*')
dfs.applymap(lambda x: bool(r.match(x))) # This will return a dataframe of booleans.
dfs.applymap(lambda x: bool(r.match(x))).any().any() # For existence.

关于python - Pandas Dataframe 使用正则表达式检查值是否存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51170763/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com