我正在尝试创建一个年份列,并从数据框中的标题列中提取年份。这段代码有效,但是列dtype是object。例如,在第1行中,年份显示为[2013]。
我该怎么做,但是将dtype列更改为float?
year_list = []
for i in range(title_length):
year = re.findall('\d{4}', wine['title'][i])
year_list.append(year)
wine['year'] = year_list
这是我数据框的开头:
country designation points province title year
Italy Vulkà Bianco 87 Sicily Nicosia 2013 Vulkà Bianco [2013]
答案 0 :(得分:2)
re.findall
返回结果列表。使用re.search
wine['year'] = [re.search('\d{4}', title)[0] for title in wine['title']]
最好还是使用熊猫extract
方法。
wine['year'] = wine['title'].str.extract(r'\d{4}')
定义
Series.str.extract(pat, flags=0, expand=True)
对于系列中的每个主题字符串,从正则表达式pat的第一个匹配项中提取组。
答案 1 :(得分:1)
您可以使用str.extract()
来代替re.findall
返回字符串列表:
wine['year'] = wine['title'].str.extract(r'\b(\d{4})\b')
或者,如果您只想匹配1900-2000s年:
wine['year'] = wine['title'].str.extract(r'\b((?:19|20)\d{2})\b')
请注意,str.extract
中的模式必须至少包含1个捕获组,其值将用于填充新列。仅考虑第一个匹配项,因此,如果需要,您可能需要稍后精确调整上下文。
我建议在\b
模式周围使用单词边界\d{4}
来将4位数字块作为整个单词进行匹配,并避免像1234567890
这样的字符串中出现部分匹配。