#python #pandas #dataframe
#python #панды #dataframe
Вопрос:
Я пытаюсь добавить вычисляемый столбец в фрейм данных на основе условия, которое включает другой фрейм данных.
Пример:
У меня есть пользователи dataframe, которые содержат:
Out[4]:
UserID Active BaseSalaryCOP BaseSalaryUSD FromDate ToDate
0 557058:36103848-2606-4d87-9af8-b0498f1c6713 True 9405749 2475.20 05/11/2020 05/11/2021
1 557058:36103848-2606-4d87-9af8-b0498f1c6713 True 3831329 1008.24 05/11/2020 04/11/2021
2 557058:7df66ef4-b04d-4ce9-9cdc-55751909a61e True 3775657 993.59 05/11/2020 05/11/2021
3 557058:b0a4e46c-9bfe-439e-ae6e-500e3c2a87e2 True 9542508 2511.19 05/11/2020 05/11/2021
4 557058:b25dbdb2-aa23-4706-9e50-90b2f66b60a5 True 8994035 2366.85 05/11/2020 05/11/2021
И у меня есть другая вызываемая скорость, которая содержит идентификатор пользователя.
Я хочу добавить столбец calculate, чтобы добавить базовое значение в долларах США между 18, где совпадают идентификатор пользователя и ToDate.
Что-то вроде (если дата совпадает с ToDate, а идентификатор пользователя совпадает, добавьте новый столбец, содержащий User[«BaseSalaryUSD»] / 18):
Out[5]:
AccountID Date rate
0 557058:36103848-2606-4d87-9af8-b0498f1c6713 04/21/2021 137.51
2 557058:7df66ef4-b04d-4ce9-9cdc-55751909a61e 05/11/2021 55.19
3 557058:b0a4e46c-9bfe-439e-ae6e-500e3c2a87e2 05/11/2021 139.51
4 557058:b25dbdb2-aa23-4706-9e50-90b2f66b60a5 05/11/2021 131.49
Есть идеи?
Спасибо
Комментарии:
1. Конечно. Как я могу добавить вывод dataframe?
2. Возможно, в Users есть строки, которые имеют правильный идентификатор пользователя, но не правильную текущую дату, чтобы соответствовать дате во втором фрейме данных, но всегда есть строка, которая соответствует.
3. Готово, если вы видите, разница между двумя первыми строками от пользователей — это столбец ToDate… Правильная строка для сопоставления является первой, потому что поле даты из Rate является основным для второй и второстепенным для первой строки в Users
4. Я добавляю столбец Rate для оценки DF… Если вы видите, первая строка совпадает с первой строкой Users DF, потому что дата находится между FromDate и Todate. Пожалуйста, обратите внимание на имена столбцов Rate DF.
5. Может содержать больше, одинаковый или равный, но всегда будет иметь идентификатор учетной записи, совпадающий с идентификатором пользователя
Ответ №1:
Используйте внешнее объединение по обоим фреймам данных, затем фильтруйте по Series.between
и разделите столбец на Series.div
:
Rate['Date'] = pd.to_datetime(Rate['Date'])
Users['FromDate'] = pd.to_datetime(Users['FromDate'])
Users['ToDate'] = pd.to_datetime(Users['ToDate'])
df = Users.merge(Rate.rename(columns={'AccountID':'UserID'}), on='UserID', how='outer')
df = df[df['Date'].between(df['FromDate'], df['ToDate'])]
df['new'] = df['BaseSalaryUSD'].div(18)
print (df)
UserID Active BaseSalaryCOP
0 557058:36103848-2606-4d87-9af8-b0498f1c6713 True 9405749
2 557058:7df66ef4-b04d-4ce9-9cdc-55751909a61e True 3775657
3 557058:b0a4e46c-9bfe-439e-ae6e-500e3c2a87e2 True 9542508
4 557058:b25dbdb2-aa23-4706-9e50-90b2f66b60a5 True 8994035
BaseSalaryUSD FromDate ToDate Date rate new
0 2475.20 2020-05-11 2021-05-11 2021-04-21 137.51 137.511111
2 993.59 2020-05-11 2021-05-11 2021-05-11 55.19 55.199444
3 2511.19 2020-05-11 2021-05-11 2021-05-11 139.51 139.510556
4 2366.85 2020-05-11 2021-05-11 2021-05-11 131.49 131.491667