我正在尝试从具有多种格式的列中提取高低位数。
例如
我目前编写的正则表达式适用于某些格式,但不适用于其他格式:
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)
答案 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