Извлечение целого числа из корейской текстовой строки с условием его содержимого и преобразование его в плавающие в пандах

Я немного застрял в следующей проблеме: у меня есть фрейм данных pandas, где один из столбцов - это строка текста на корейском языке, которая выглядит следующим образом:

data = {'id': [1,2,3,4,5], 'age': ['3.5년령(추정)','3개월령','5일령(추정)','3일령','1.5개월령(추정)']}
df = pd.DataFrame(data)

Условно на том, что содержит строка, мне нужно рассчитать возраст в днях. Текст в парентезе (추정), может или не может появиться в строке, и это означает "оценочный". Текст перед скобками может быть 년령 (годы), 개월령 (месяцы) или 일령 (дни). И, наконец, число перед текстом может быть целым числом или с плавающей запятой с одним или двумя десятичными знаками. Мне нужно извлечь число и преобразовать его в возраст в днях (с округлением до 0 десятичных знаков), например так:

result = {'id': [1,2,3,4,5],'age': [1278, 90, 5, 3, 45]}
df1 = pd.DataFrame(result)

Я попытался извлечь числовую часть строки с помощью регулярных выражений, как показано ниже, но она не охватывает все случаи и, похоже, не работает хорошо.

df['age'].str.replace(r'\([추정]\)$', '')

Буду признателен за любые предложения. Спасибо.

1 ответ

Решение

Использование:

d = {'년령': 365, '개월령' : 30, '일령' : 1}
pat = r'(\d*\.\d+|\d+)'
#replace by dictionary
b = df['age'].replace(d, regex=True)
#https://stackru.com/a/4703409/2901002
a = df['age'].str.extract(pat, expand=False).astype(float)
#multiple together
df['age'] = b * a
print (df)
   id     age
0   1  1277.5
1   2    90.0
2   3     5.0
3   4     3.0
4   5    45.0
Другие вопросы по тегам