python - 识别 Pandas 数据框列是否包含列表中的元素

标签 python regex pandas

我有一个包含大量行(几百万)的数据框。其中一列包含一个包含逗号分隔列表的字符串(但不是 Python 列表,只是一个由逗号分隔的项目列表)。数据框可以表示为:

df = pd.DataFrame({'A':['a,b,c','b,c,d,e','a,b,e,f','a,c ,d,f']})

         A
0    a,b,c
1  b,c,d,e
2  a,b,e,f
3  a,c,d,f

我有一个单独的 Python 列表,其中包含各种元素,例如:

lst1 = ['w','x','y','z','b']

我想在数据库中创建一个附加列,指示 lst1 中的元素之一是否包含在数据库的 A 列中。

我的解决方案是将列表元素转换为正则表达式,并使用 .str.contains() 结构将行标记为 True错误:

regex = regex = '|'.join(['(?:{})'.format(i) for i in lst1])

这会产生以下正则表达式:

(?:w)|(?:x)|(?:y)|(?:z)|(?:b)

然后:

df['B'] = df['A'].str.contains(正则表达式)

         A      B
0    a,b,c   True
1  b,c,d,e   True
2  a,b,e,f   True
3  a,c,d,f  False

这在所描述的迷你示例中运行良好,但在具有包含数百万行的数据框的真实示例中,我担心使用正则表达式可能太慢而不实用。有没有更快的方法来达到相同的结果?

编辑

根据@jezrael 的回答,我进行了时间比较。我生成了一个包含 400 万行的数据框和一个项目列表,如下所示:

import timeit

df = pd.DataFrame({'A':['the,cat,sat,on,mat','the,cow,jumped,over,moon','humpty,dumpty,sat,on,the,wall','tiger,burning,bright']*1000000})

terms = ['sat','mat','moon','small','large','home','sliced']
regex = '|'.join(['(?:{})'.format(i) for i in terms])

%timeit df['B'] = df['A'].str.contains(regex)

这产生了:

1 loop, best of 3: 8.09 s per loop

相比于:

import timeit

df = pd.DataFrame({'A':['the,cat,sat,on,mat','the,cow,jumped,over,moon','humpty,dumpty,sat,on,the,wall','tiger,burning,bright']*1000000})

terms = ['sat','mat','moon','small','large','home','sliced']
s = set(terms)

%timeit df['B1'] = [bool(set(x.split(',')) & s) for x in df['A']]

产生了:

1 loop, best of 3: 8.36 s per loop

虽然正如@jezrael 所说,正则表达式选项的性能将受到许多因素的影响,例如字符串长度、匹配项数量等,但在此特定设置中的结果非常相似。

最佳答案

一种非正则表达式的解决方案是使用集合的交集并转换为 bool:

s = set(lst1)
df['B1'] = [bool(set(x.split(',')) & s) for x in df['A']]
print (df)
         A      B     B1
0    a,b,c   True   True
1  b,c,d,e   True   True
2  a,b,e,f   True   True
3  a,c,d,f  False  False

关于python - 识别 Pandas 数据框列是否包含列表中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54763097/

相关文章:

python - 获取 Pandas 中 groupby 操作的大小

python - 捕获除 SSL 问题之外的请求

python - 使用申请相似的列名称迭代函数

regex - 如何在vim中过滤一些多行语句

c# - 使用 LINQ 包含 - 如何确保后面没有特定字符

python - 将 Pandas 数据框转换为 float

python - 在代码库中禁止 `strftime`

java - 如何使用Rhino删除<scripts>标签?

python - 如何使用不同的分隔符将Python中的列拆分为多列

python - 按 pandas 中的操作分组