Pandas.series str提取未获得一位数字的字符串

时间:2019-04-24 17:48:42

标签: python regex pandas

我需要从一列字符串中提取数字。但是str.extract(\ d)不适用于仅数字字符串。

df['extract'] = df['original'].str.extract('(\d+)')

请将该数据框视为字典:

{'original': {0: 'NO RATING',
  1: 4,
  2: '3-',
  3: 3,
  4: '4-',
  5: '2-',
  6: '2+',
  7: '4+',
  8: '5-',
  9: 5,
  10: '5+',
  11: 2,
  12: '3+',
  13: '6+',
  14: '6-',
  15: 6,
  16: 7},
 'extract': {0: nan,
  1: nan,
  2: '3',
  3: nan,
  4: '4',
  5: '2',
  6: '2',
  7: '4',
  8: '5',
  9: nan,
  10: '5',
  11: nan,
  12: '3',
  13: '6',
  14: '6',
  15: nan,
  16: nan}}

df是具有2列的pd数据帧,df ['orginal']包含2 +,2-,2、3-,3、3 +,无等级等值。

代码工作会生成新列df ['extract'],它对于值2-(给定2),3 +(给定3),NO RATING(给定NaN)是正确的。但这对于2(给出NaN,但我期望2)和3(给出NaN,但我期望3)这样的值是错误的。

my result

2 个答案:

答案 0 :(得分:0)

问题是某些值是整数,而有些则是字符串。尽管str.extract没有出错,但是如果它是整数,它就不会提取正确的值。您可以使用lambda和findall函数来处理这种情况。然后在值大于9的情况下,添加可选的运算符(+)以获取更多数字。

df['extract'] = df['original'].map(lambda x: re.findall('(\d+)', str(x))) \
                           .map(lambda i: i[0] if len(i)>0 else None)

结果:

   original extract
0   5         5
1   13+      13

答案 1 :(得分:0)

在使用extract

之前,请确保已拥有所有字符串。
df['extract'] = df['original'].astype(str).str.extract('(\d+)')