首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我是否可以在Python列中使用正则表达式搜索或匹配,其中每个单元格都是列表列表?

我是否可以在Python列中使用正则表达式搜索或匹配,其中每个单元格都是列表列表?
EN

Stack Overflow用户
提问于 2020-05-23 16:30:58
回答 1查看 1K关注 0票数 0

我有一个有点大的CSV文件(>2000行),我已经读到了Pandas,并且希望根据某个数据列中是否出现一个特定的单词来创建一个新的指示器列。我一直在尝试使用regex搜索,这可能过于致命,因为单词总是会被空格分隔,但是DataFrame的单元格是字符串列表的列表。我尝试过使用双列表理解进行迭代,但也存在错误,而且作为Python新手,我也很好奇,是否有一个通用的解决方案来处理未指定数量的嵌套列表。下面是一个示例,其中我的最终目标是一个新列,其中的行中有1,其中单词'saddle'在选定列的任何位置出现在单元格中,如果没有,则为0

我的DataFrame看起来像这样

代码语言:javascript
复制
import pandas as pd
import numpy as np

cycling = pd.DataFrame(
    {
        'qty' : [1,0,2,1,1],
        'item' : ['frame','frame',np.nan,'order including a saddle and other things','brake'],
        'desc' : [np.nan,['bike','wheel'],['bike',['tire','tube']],['saddle',['seatpost','bag']],['bike','brakes']]
    }
)

这是DataFrame

我可以搜索item列来实现我的目标,使用这段代码(效率和其他建议-非常欢迎!):

代码语言:javascript
复制
cycling['saddle1'] = [int(bool(re.search(r"saddle",x))) for x in cycling['item'].replace(np.nan,'missing')]

我的原始数据集缺少指示符列中要解析为0的值;否则,我不关心它们。上面的代码对于每个单元格正确识别了第四行。中有字符串的列都很有用,但是当单元格包含一个列表或列表时(比如desc列),我不能修改它来工作。我试过:

代码语言:javascript
复制
cycling['saddle2'] = [int(bool(re.search(r"saddle",x))) for y in cycling['desc'].replace(np.nan,'missing') for x in y]

但是我得到了以下错误

代码语言:javascript
复制
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-45-4c72cdaa87a4> in <module>()
----> 1 cycling['saddle2'] = [int(bool(re.search(r"saddle",x))) for y in cycling['desc'].replace(np.nan,'missing') for x in y]
      2 cycling.head()

1 frames
/usr/lib/python3.6/re.py in search(pattern, string, flags)
    180     """Scan through string looking for a match to the pattern, returning
    181     a match object, or None if no match was found."""
--> 182     return _compile(pattern, flags).search(string)
    183 
    184 def sub(pattern, repl, string, count=0, flags=0):

TypeError: expected string or bytes-like object

我认为错误在于它不喜欢接收正则表达式的非字符串(可能是未扁平的列表?)。是否有一种方法可以在Pandas中搜索特定的单词(可能使用regex),其中一些单元格是字符串列表,有些是包含嵌套列表的字符串列表,还有一些单元格是缺失的,这样就可以创建一个指示列,在它出现的任何地方都有一个1 (不管它是嵌套的还是未嵌套的),而0则是其他的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-23 16:47:45

您可以使用map,而不是运行for循环(这很慢)。您可以将列表转换为str以调用regex。像这样:-

代码语言:javascript
复制
import pandas as pd
import numpy as np
import re

cycling = pd.DataFrame(
    {
        'qty' : [1,0,2,1,1],
        'item' : ['frame','frame',np.nan,'order including a saddle and other things','brake'],
        'desc' : [np.nan,['bike','wheel'],['bike',['tire','tube']],['saddle',['seatpost','bag']],['bike','brakes']]
    }
)
cycling['saddle1'] = cycling['item'].replace(np.nan,'missing').map(lambda x :int(bool(re.search(r"saddle",x))))
cycling['saddle2'] = cycling['desc'].replace(np.nan,'missing').map(lambda x :int(bool(re.search(r"saddle",str(x)))))

cycling

希望这能帮上忙

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61975232

复制
相关文章

相似问题

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