正则表达式可从年龄范围的DataFrame列中提取具有多种格式的数字

时间:2019-02-27 17:31:18

标签: python regex pandas

我正在尝试从具有多种格式的列中提取高低位数。

例如

  • 如果值是:“ 34-35岁”,我想收集(34,35)
  • 如果值是:“ 35-44岁”,我想收集(35,44)
  • 如果值是:'75岁以上,我可以收集(75,'')

我目前编写的正则表达式适用于某些格式,但不适用于其他格式:

dataframe[['age_low', 'age_high]] = dataframe['age'].str.extract(r'(\d*)[\s-]*(\d*)')

以下是原始年龄栏中的所有可能值:

dataframe['age'].unique()

array([nan, 'Age 34 - 35 ', 'Age 78 - 79 ', 'Age 60 - 61 ',
       'Age 50 - 51 ', 'Age 20 - 21 ', 'Age 70 - 71 ', 'Age 82 - 83 ',
       'Age 88 - 89 ', 'Age 68 - 69 ', 'Age 86 - 87 ', 'Age 84 - 85 ',
       'Age 46 - 47 ', 'Age 30 - 31', 'Age 94 - 95 ', 'Age 22 - 23 ',
       'Age 44 - 45 ', 'Age 74 - 75 ', 'Age 40 - 41', 'Age 72 - 73 ',
       'Age 52 - 53 ', 'Age 48 - 49 ', 'Age 66 - 67 ', 'Age 62 - 63 ',
       'Age 56 - 57 ', 'Age 64 - 65 ', 'Age 38 - 39 ', 'Age 42 - 43 ',
       'Age 54 - 55 ', 'Age 24 - 25 ', 'Age 90 - 91 ', 'Age 76 - 77 ',
       'Age 58 - 59 ', 'Age 32 - 33', 'Age 26 - 27 ', 'Age 80 - 81 ',
       'Age 28 - 29 ', 'Age 36 - 37', 'Age 96 - 97 ',
       'Age greater than 99', 'Age 18 - 19', 'Age 92 - 93 ',
       'Age 98 - 99 ','65-74 years old', '35-44 years old', '45-54 years old',
       '75+ years old', '55-64 years old', '25-34 years old',
       '18-24 years old'], dtype=object)

1 个答案:

答案 0 :(得分:0)

对于您的问题中只有一个年龄值的可能值,该年龄始终代表该范围的低端。结果,您可以只捕获字符串中的前一个或多个数字,然后使用一个非捕获组来指示可能的后续非数字序列,然后是另一个由一个或多个数字组成的组。如果字符串中存在第二个年龄,它将被捕获为范围的高端。如果只有一个年龄,您将只获得该范围上限的NaN值。

例如:

import pandas as pd

ages = ['Age 96 - 97', 'Age greater than 99', '65-74 years old', '75+ years old']
df = pd.DataFrame({'age': ages})

df[['age_low', 'age_high']] = df['age'].str.extract(r'(\d+)(?:\D+(\d+))?')
print(df)
#                    age age_low age_high
# 0          Age 96 - 97      96       97
# 1  Age greater than 99      99      NaN
# 2      65-74 years old      65       74
# 3        75+ years old      75      NaN