Мне нужно отследить, что изменилось между двумя фреймами данных:
df1 = DataFrame({'A':['a1','Changed','a3','Deleted'],'B':['b2','b2','b3','Deleted']})
df2 = DataFrame({'A':['a1','a2','a3','Added'],'B':['b2','b2','Changed','Added']})
df1:
A B df1
0 a1 b2 1
1 Changed b2 1
2 a3 b3 1
3 Deleted Deleted 1
df2:
A B df2
0 a1 b2 1
1 a2 b2 1
2 a3 Changed 1
3 Added Added 1
Желаемый вывод:
A B df1 df2 Diff Delta
Added Added 0 1 -1 Added
Changed b2 1 0 1 Changed
a2 b2 0 1 -1 Added
a3 Changed 1 0 1 Changed
Deleted Deleted 1 0 1 Deleted
Дела, которые необходимо отслеживать: Любые изменения в существующих записях, добавления, удаления.
Я попытался инициализировать наличие строки в каждом фрейме данных с 1 и выполнить внешнее объединениеполучение разницы между 'df1' и 'df2' и использование всех различий для разработки логики, которая может назначать изменения, удаления, дополнения к фрейму данных.Например, где diff == -1, это означает, что 'df1' = 0 и 'df2' = 1, что подразумевает добавление.
df1['df1'] = 1
df2['df2'] = 1
df = pandas.merge(df1,df2,on=['A','B'],how='outer')
df.fillna(0,inplace=True)
df['Diff'] = df['df1'] - df['df2']
df['Delta'] = numpy.nan
df.loc[df['A'].duplicated(keep=False)&df['Diff']!=0,'Delta'] ='Changed'
df.loc[(df['Delta'].isnull())&(df['Diff']== (-1)),'Delta'] = 'Added'
df.loc[(df['Delta'].isnull())&(df['Diff']== (1)),'Delta'] = 'Deleted'
print df.loc[df['Delta'].notnull()].drop_duplicates(subset='A')
Это дает мне:
Я добавил столбец «Correct_Delta», указывающий, какой должен быть правильный выходной столбец «Дельта».У меня проблема с выделенными ячейками.
PS: столбец «A» всегда будет уникальным, а «A» и «B» будут иметь отношение «один к одному» в некоторых случаях и отношение «один к одному» в некоторых случаях.
Кто-нибудь может помочь, пожалуйста?