#python #pandas #replace #find #re
Вопрос:
У меня есть в качестве входных данных:
["3 years 8 months", "10 months", "1 year 10 months", "9 months", " 1 month ", "1 year", "3 years"]
Я хочу получить этот результат:
[3.8, 0.10, 1.10, 0.09, 0.01, 1, 3]
Ответ №1:
Вы можете использовать str.split
:
def to_num(s):
c = {'year':1, 'years':1, 'month':0.01, 'months':0.01}
return sum(int(s[i])*c[s[i 1]] for i in range(0, len(s), 2))
vals = ["3 years 8 months", "10 months", "1 year 10 months", "9 months", "1 month", "1 year", "3 years"]
result = [to_num(i.split()) for i in vals]
Выход:
[3.08, 0.1, 1.1, 0.09, 0.01, 1, 3]
Ответ №2:
Способ 1: используйте re.search
import re
def date_to_number(x):
year, month = 0, 0
if re.search(r'(d*)syear', x):
year = float(re.search(r'(d*)syear', x).group(1))
if re.search(r'(d*)smonth', x):
month = float(re.search(r'(d*)smonth', x).group(1))/100
return year month
numbers = [date_to_number(i) for i in data]
Выход:
print(numbers)
[3.08, 0.1, 1.1, 0.09, 0.01, 1.0, 3.0]
Способ 2: использование extract()
у панд
Если ваши данные хранятся во фрейме данных, вы можете попробовать это:
df = pd.DataFrame(data, columns=['date'])
df['date_to_number'] = (df['date'].str.extract(r'(d*)syear').fillna(0).astype('int')
df['date'].str.extract(r'(d*)smonth').fillna(0).astype('int').divide(100))
Выход:
печать(df)
date date_to_number
0 3 years 8 months 3.08
1 10 months 0.10
2 1 year 10 months 1.10
3 9 months 0.09
4 1 month 0.01
5 1 year 1.00
6 3 years 3.00