Создание категориальной переменной из непрерывной переменной даты и времени - PullRequest
0 голосов
/ 03 сентября 2018

Я пытаюсь создать категориальную переменную из непрерывной переменной datetime.

В основном, если они между 15 и 25, то Age_category = 1, если они между 25 и 35, то Age_category = 2.

У меня есть это, чтобы я мог сделать одно условие, это работает:

df.loc[(df['Age_days'] > timedelta(days=(25*365)), 'Age2')] = '1'

Когда я пытаюсь выполнить два условия, оно терпит неудачу:

df.loc[(df['Age_days'] > timedelta(days=(15*365)) & (df['Age_days'] <= timedelta(days=(25*365)), 'Age_cat'))] = '1'

Ошибка, которую я получаю, говорит о том, что ей не нравится использование '&':

TypeError: unsupported operand type(s) for &: 'datetime.timedelta' and 'tuple'

Я пытался заменить & на 'и', но это тоже не нравится:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Есть идеи, как мне это исправить?

1 Ответ

0 голосов
/ 03 сентября 2018

В Pandas вы должны использовать методы Pandas, а не модуль datetime.

В этом случае вы можете NumPy преобразовать значения timedelta в float, а затем использовать pd.cut для определения возраста. По умолчанию pd.cut включается справа от каждого диапазона.

df = pd.DataFrame({'Age': [10, 15, 17, 20, 25, 30, 35, 40]})
df['Age'] = pd.to_timedelta(df['Age'], unit='Y')

df['Category'] = pd.cut(df['Age'] / np.timedelta64(1, 'Y'), [15, 25, 35], labels=[1, 2])

print(df)

                  Age Category
0  3652 days 10:12:00      NaN
1  5478 days 15:18:00      NaN
2  6209 days 02:56:24      1.0
3  7304 days 20:24:00      1.0
4  9131 days 01:30:00      1.0
5 10957 days 06:36:00      2.0
6 12783 days 11:42:00      2.0
7 14609 days 16:48:00      NaN

Затем можно сбросить нулевые значения и преобразовать категории в int (если требуется).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...