Панды - Сравнение двух датакадров по дате и поиск пропущенных - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть Dataframe со списком уникальных рабочих дат в месяце, называемых днями.

У меня есть другой Dataframe, в котором есть список дней, в течение которых сотрудник сообщил о работе, называемый сообщением.

Я пытаюсь найти дни, когда сотрудник не отчитывался на работе.

Ниже приведен пример представления Dataframes:

days
11/1/2018
11/2/2018
11/3/2018
11/4/2018
11/5/2018
11/6/2018
11/7/2018

Представление названного Dataframe:

emp_id, date
1001,11/1/2018
1001,11/2/2018
1002,11/1/2018
1002,11/3/2018
1003,11/3/2018

Ожидаемый результат (в котором указаны дни, когда сотрудник не сообщал):

emp_id,date
1001,11/3/2018
1002,11/2/2018
1003,11/1/2018
1003,11/2/2018

Обновление Я создал первый кадр данных, как показано ниже

import numpy as np
df_1 = np.sort(df_master.date.unique())
df_1_df = pd.DataFrame(df_1)
df_1_df.columns

RangeIndex(start=0, stop=1, step=1)

1 Ответ

0 голосов
/ 11 декабря 2018

Вам нужно merge с внутренним соединением по умолчанию, а затем reindex со всеми уникальными значениями emp_id и date, последний merge с параметром indicator=True для фильтрации строк, о которых не сообщается:

reported['date'] = pd.to_datetime(reported['date'])

df1 = reported.set_index(['emp_id', 'date'])
mux = pd.MultiIndex.from_product(df1.index.levels, names=df1.index.names)

df3 = (df1.reindex(mux)
         .reset_index()
         .merge(reported, indicator=True, how='outer')
         .query('_merge != "both"')
         .drop('_merge', axis=1))
print (df3)
   emp_id       date
2    1001 2018-11-03
4    1002 2018-11-02
6    1003 2018-11-01
7    1003 2018-11-02

Еще одно решение, благодаря @IMCoins - фильтрация по isin с ~ для инвертированного логического значениямаска:

df2 = df1.reindex(mux)
df3 = df2[~df2.index.isin(df1.index)].reset_index()
print (df3)

   emp_id       date
0    1001 2018-11-03
1    1002 2018-11-02
2    1003 2018-11-01
3    1003 2018-11-02
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...