我有一个有点大的CSV文件(>2,000行),我把它读到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
我认为这个错误是它不喜欢接收非字符串的regex(可能是未膨胀的列表?有没有办法在Pandas中搜索一列特定的单词(可能使用regex),其中有些单元格是字符串列表,有些是字符串列表,也包含嵌套列表,有些单元格缺失,创建一个指标列,并以 1
的任何地方(无论它是否嵌套),以及 0
否则呢?
与其运行for循环(这很慢),你可以使用 map
. 您可以将列表转换为 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
希望能帮到你!!1