我有一个有点大的CSV文件(>2000行),我已经读到了Pandas,并且希望根据某个数据列中是否出现一个特定的单词来创建一个新的指示器列。我一直在尝试使用regex搜索,这可能过于致命,因为单词总是会被空格分隔,但是DataFrame的单元格是字符串列表的列表。我尝试过使用双列表理解进行迭代,但也存在错误,而且作为Python新手,我也很好奇,是否有一个通用的解决方案来处理未指定数量的嵌套列表。下面是一个示例,其中我的最终目标是一个新列,其中的行中有1,其中单词'saddle'在选定列的任何位置出现在单元格中,如果没有,则为0。
我的DataFrame看起来像这样
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']]
}
)我可以搜索item列来实现我的目标,使用这段代码(效率和其他建议-非常欢迎!):
cycling['saddle1'] = [int(bool(re.search(r"saddle",x))) for x in cycling['item'].replace(np.nan,'missing')]我的原始数据集缺少指示符列中要解析为0的值;否则,我不关心它们。上面的代码对于每个单元格正确识别了第四行。中有字符串的列都很有用,但是当单元格包含一个列表或列表时(比如desc列),我不能修改它来工作。我试过:
cycling['saddle2'] = [int(bool(re.search(r"saddle",x))) for y in cycling['desc'].replace(np.nan,'missing') for x in y]但是我得到了以下错误
---------------------------------------------------------------------------
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则是其他的?
发布于 2020-05-23 16:47:45
您可以使用map,而不是运行for循环(这很慢)。您可以将列表转换为str以调用regex。像这样:-
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希望这能帮上忙
https://stackoverflow.com/questions/61975232
复制相似问题