Добавить вычисляемый столбец в Dataframe на основе other

#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