根据其他列将新列添加到Panda数据框

时间:2018-10-31 17:13:45

标签: regex python-3.x pandas dataframe

我正在尝试向Panda数据集添加新列。 新列df ['Year_Prod']源自我要提取年份的另一个df ['title']。

数据示例:

country    designation     title
Italy      Vulkà Bianco    Nicosia 2013 Vulkà Bianco (Etna)         
Portugal   Avidagos        Quinta dos Avidagos 2011 Avidagos Red (Douro)      

代码:

import re

import pandas as pd

df=pd.read_csv(r'test.csv', index_col=0)

df['Year_Prod']=re.findall('\\d+', df['title'])

print(df.head(10))

我遇到以下错误:

 File "C:\Python37\lib\site-packages\pandas\core\frame.py", line 3119, in __setitem__self._set_item(key, value)

  File "C:\Python37\lib\site-packages\pandas\core\frame.py", line 3194, in _set_item value = self._sanitize_column(key, value)

  File "C:\Python37\lib\site-packages\pandas\core\frame.py", line 3391, in _sanitize_column value = _sanitize_index(value, self.index, copy=False)

  File "C:\Python37\lib\site-packages\pandas\core\series.py", line 4001, in _sanitize_index raise ValueError('Length of values does not match length of ' 'index')

**ValueError: Length of values does not match length of index**

谢谢,请让我知道您的想法。

5 个答案:

答案 0 :(得分:4)

您可以使用熊猫str.extract

if (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) &&
   strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest')

编辑:正如@Paul H.在评论中所建议的那样,您的代码不起作用的原因是re.findall需要一个字符串,但是您正在传递一个序列。可以使用apply来完成,在每一行中,传递的值是一个字符串,但由于str.extract效率更高而没有多大意义。

df['Year_Prod']= df.title.str.extract('(\d{4})')

    country     designation     title                                          Year_Prod
0   Italy       Vulkà Bianco    Nicosia 2013 Vulkà Bianco (Etna)                2013
1   Portugal    Avidagos        Quinta dos Avidagos 2011 Avidagos Red (Douro)   2011

答案 1 :(得分:3)

pandas也有findall

df.title.str.findall('\d+').str[0]
Out[239]: 
0    2013
1    2011
Name: title, dtype: object

#df['Year_Prod']= df.title.str.findall('\d+').str[0] from pygo

答案 2 :(得分:2)

您未指定分隔符-,的默认值为.read_csv

您可以使用pd.Series.apply

import re    
import pandas as pd

def year_finder(x):
    return re.findall('\\d+', x)[0] # First match I find

df=pd.read_csv(r'test.csv', delimiter='||', index_col=0)
df['Year_Prod']= df["title"].apply(year_finder)

print(df.head(10))

编辑:对于str.extract方法,请参见@Vaishali的答案

答案 3 :(得分:1)

这是基于iloc方法的另一种方法。

>>> df['Year_Prod'] = df.iloc[:,2].str.extract('(\d{4})', expand=False)
>>> df
    country   designation                                          title Year_Prod
0     Italy  Vulkà Bianco               Nicosia 2013 Vulkà Bianco (Etna)      2013
1  Portugal      Avidagos  Quinta dos Avidagos 2011 Avidagos Red (Douro)      2011

答案 4 :(得分:1)

str.translate而不是regex

def f(x):
  x = ''.join([c if c.isdigit() else ' ' for c in x])
  return x.strip().split(None, 1)[0]

df.assign(Year_Prod=df.title.map(f))

    country   designation                                          title Year_Prod
0     Italy  Vulkà Bianco               Nicosia 2013 Vulkà Bianco (Etna)      2013
1  Portugal      Avidagos  Quinta dos Avidagos 2011 Avidagos Red (Douro)      2011