Проверьте, существует ли vaue в кадре данных в другом кадре данных с условием - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть фрейм данных pandas со структурой, похожей на:

Application | Account  |  Application_Date
1           | 444444   |  10/01/2018
2           | 444444   |  09/01/2018
3           | 555555   |  10/01/2018

И другой фрейм данных с такой структурой:

Case     | Account | Case_Date
1        | 444444  | 09/01/2018
2        | 444444  | 11/01/2018
3        | 444444  | 10/01/2018
4        | 555555  | 07/01/2018

Я хочу проверить, есть ли Учетная запись впервый фрейм данных существует во втором фрейме данных, только если Case_date больше или равен Application_Date и получает выходные данные в столбце в первом фрейме данных, а также номера дел, например:

Application | Account  |  Application_Date | Case_Exists | Case_Number
1           | 444444   |  10/01/2018       |  Y          |  2, 3
2           | 444444   |  09/01/2018       |  Y          |  1, 2, 3
3           | 555555   |  10/01/2018       |  N          |

Не могли бы вы посоветовать?

Спасибо!

1 Ответ

0 голосов
/ 29 ноября 2018

Это немного запутанное решение, но оно вас туда доставит:

  1. установите для даты правильное время и дата
  2. Сначала выполните слияние между двумя вашими фреймами данных
  3. Найдите, когда даты наблюдений больше или равны датам подачи заявок, сгруппированные по Application и Account, и получите уникальные наблюдения
  4. , объедините результат этого с вашим первым df
  5. Присвойте Y ненулевым значениям (если были обнаружены случаи):

Настройка:

>>> df1
   Application  Account Application_Date
0            1   444444       10/01/2018
1            2   444444       09/01/2018
2            3   555555       10/01/2018
>>> df2
   Case  Account   Case_Date
0     1   444444  09/01/2018
1     2   444444  11/01/2018
2     3   444444  10/01/2018
3     4   555555  07/01/2018

Процесс:

# set to datetime
df1['Application_Date'] = pd.to_datetime(df1['Application_Date'])

df2['Case_Date'] = pd.to_datetime(df2['Case_Date'])

# first merge
merged = df2.merge(df1)

# loc and groupby
cases = (merged.loc[merged['Case_Date'] >= merged['Application_Date']]
         .groupby(['Account','Application'])['Case']
         .unique())

# merge back
final = (cases.to_frame('Case_Number').merge(df1,left_index=True,
                                right_on=['Account', 'Application'],
                                how='outer')
         # Following line is just to re-adjust column order
         [['Application','Account','Application_Date','Case_Number']])

# assign Y and N
final['Case_Exists'] = final.Case_Number.notnull().map({True:'Y',False:'N'})

>>> final
   Application  Account Application_Date Case_Number Case_Exists
0            1   444444       2018-10-01      [2, 3]           Y
1            2   444444       2018-09-01   [1, 2, 3]           Y
2            3   555555       2018-10-01         NaN           N
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...