将dataframe列从列表转换为float

时间:2019-03-01 22:27:34

标签: python regex pandas

我正在尝试创建一个年份列,并从数据框中的标题列中提取年份。这段代码有效,但是列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]

2 个答案:

答案 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这样的字符串中出现部分匹配。