У меня есть датафрейм с датами рождения в 'Дата рождения', и я хотел бы сопоставить их с категориями, которые находятся в другом фрейме данных. Например:
firstname lastname birthdate new_professionactuelle new_regiononame new_communeoname
0 Ferhat Abbas 1899-08-24 00:00:00 Ecrivain Jijel Bouafourna
1 Ahmed Ben Bella 1916-12-25 00:00:00 combattant Oranie Maghnia
И возрастные категории: df['S02Q02_Age_rec'].unique()
, что: array(['16-24', '25-34', '35-44', '55 or above', '45-54'], dtype=object)
Я знаю, как получить возраст этих парней:
from datetime import datetime, date
def calculate_age(born):
today = date.today
days_in_year = 365.2425
if born != None:
age = int((date.today() - datetime.strptime(born, '%Y-%m-%d %H:%M:%S').date()).days / days_in_year)
return age
else:
return born
df["age"] = df["birthdate"].apply(calculate_age)
Но как мне соответствовать возрасту, который будет int
для категории string
, такой как 25-34
?
apply
Я пытался:
import re
def age_classifier(age, intervals):
for interval in intervals:
lower = int(re.split("\s+", interval)[0])
upper = int(re.split("\s+", interval)[1])
if age in range(lower,upper):
return interval
else:
return age
df["age"] = df["birthdate"].apply(age_classifier(intervals = age_intervals))
Но он возвращает:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-301-95b25980deea> in <module>
----> 1 df["age"] = df["birthdate"].apply(age_classifier(intervals = age_intervals))
TypeError: age_classifier() missing 1 required positional argument: 'age'
Поэтому я оставил закодированные интервалы в коде:
def age_classifier(age, intervals = None):
intervals = age_intervals
for interval in intervals:
lower = int(re.split("\s+", interval)[0])
upper = int(re.split("\s+", interval)[1])
if age in range(lower,upper):
return interval
else:
return age
Но это возвращает меня назад, с df["age"] = df["birthdate"].apply(age_classifier)
:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-318-757dd6509cc9> in <module>
----> 1 df["age"] = df["birthdate"].apply(age_classifier)
C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\series.py in apply(self, func, convert_dtype, args, **kwds)
3589 else:
3590 values = self.astype(object).values
-> 3591 mapped = lib.map_infer(values, f, convert=convert_dtype)
3592
3593 if len(mapped) and isinstance(mapped[0], Series):
pandas/_libs/lib.pyx in pandas._libs.lib.map_infer()
<ipython-input-316-75658a636ff4> in age_classifier(age, intervals)
2 intervals = age_intervals
3 for interval in intervals:
----> 4 lower = int(re.split("\s+", interval)[0])
5 upper = int(re.split("\s+", interval)[1])
6 if age in range(lower,upper):
ValueError: invalid literal for int() with base 10: '16-24'
np.vectorize
:
Я также пытался:
np.vectorize(age_classifier)(df["birthdate"],age_intervals)
Но функция, кажется, только для чтения статьи за статьей, т.е. df["birthdate"][0]
и 16-24
.