Как сопоставить дату рождения с возрастной категорией? - PullRequest
1 голос
/ 12 февраля 2020

У меня есть датафрейм с датами рождения в 'Дата рождения', и я хотел бы сопоставить их с категориями, которые находятся в другом фрейме данных. Например:

    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.

1 Ответ

0 голосов
/ 13 февраля 2020
from datetime import datetime, date 

def calculate_age(born):
    today = date.today
    days_in_year = 365.2425
    if type(born) == str:
        age = int((date.today() - datetime.strptime(born, '%Y-%m-%d %H:%M:%S').date()).days / days_in_year)
        return age
    else:
        age = int((date.today() - born.date()).days / days_in_year)
        return age
    return born

df['birthdate']=pd.to_datetime(df['birthdate'], errors='coerce')
df["age"] = df["birthdate"].dropna().apply(calculate_age)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...