Сравните два кадра данных на основе комбинации двух столбцов в pandas - PullRequest
1 голос
/ 11 января 2020

Мне нужно фрейм данных, как показано ниже.

, где df2 - это обновленная версия df1.

df1:

Sector      Plot         Status
SE1         1            UnderConstruction
SE1         2            Constructed
SE1         3            UnderConstruction
SE2         1            Constructed
SE2         2            Constructed
SE2         3            Developed

df2:

Sector      Plot         Status
SE1         1            Constructed
SE1         2            Constructed
SE1         3            Developed
SE2         1            Constructed
SE2         2            Developed
SE2         3            Developed
SE3         1            Developed

Из вышесказанного я хотел бы сравнить две таблицы выше и создать новую таблицу, как показано ниже в pandas.

Sector      Plot         NewStatus         PreviousStatus
SE1         1            Constructed       UnderConstruction
SE1         3            Developed         UnderConstruction
SE2         2            Developed         Constructed

1 Ответ

1 голос
/ 11 января 2020

Используйте merge с внешним объединением по первым 2 столбцам, а затем отфильтруйте те же строки, а также строки с ошибочными значениями по DataFrame.dropna:

df = df2.merge(df1, how='outer', on=['Sector','Plot'], suffixes=('_new','_prev'))
df = df[df['Status_new'].ne(df['Status_prev'])].dropna(subset=['Status_new','Status_prev'])
print (df)
  Sector  Plot   Status_new        Status_prev
0    SE1     1  Constructed  UnderConstruction
2    SE1     3    Developed  UnderConstruction
4    SE2     2    Developed        Constructed

Вы можете создать функцию как:

def compare(df1, df2, on, comp):
    df = df2.merge(df1, how='outer', on=on, suffixes=('_new','_prev'))
    return (df[df[f'{comp}_new'].ne(df[f'{comp}_prev'])]
                .dropna(subset=[f'{comp}_new',f'{comp}_prev']))


df = compare(df1, df2, ['Sector','Plot'], 'Status')
...