2016-12-02 5 views
0

Я пытаюсь найти способ достижения нижеследующего: df1 и df2 - это 2 примера данных, между которыми я нашел, чтобы найти разницу. Они имеют одинаковые столбцы, но данные строк могут изменяться в зависимости от новых добавленных имен, старых удаленных или измененных данных существующего набора.Pandas: Изменение между двумя кадрами данных

df1:

Col1 Col2 Col3 Col4 Col5 
0  1 ABC 94 xxx apple 
1  1 DEF 24 xxx apple 
2  2 ABC 40 yyy banana 
3  3 ABC 74 zzz pear 
4  3 DEF 43 zzz pear 

df2:

Col1 Col2 Col3 Col4  Col5 
0  1 ABC 71 xxx  apple 
1  2 PQR 65 yyy  banana 
2  3 ABC 86 zzz  pear 
3  3 DEF 53 zzz  pear 
4  4 PQR 26 mmm pineapple 

выход:

Col1 Col2 Col3 Col4  Col5 
0  1 ABC -23 xxx  apple 
1  1 DEF -24 xxx  apple 
2  2 ABC -40 yyy  banana 
3  2 PQR 65 yyy  banana 
4  3 ABC 12 zzz  pear 
5  3 DEF 10 zzz  pear 
6  4 PQR 26 mmm pineapple 

Я попытался this и StackOverflow ссылки, которые он упоминает, но мне нужно изменение только применимо только к конкретным столбцам и добавлять новые строки с новым ключом (Col1 в моем примере) alto gether

Спасибо vm за то, что посмотрели!

+0

Таким образом, ваш требуемый результат на выходе: блок? –

+0

Действительно .. это пример, который я создал, который, я думаю, затрагивает все аспекты моей проблемы – spiff

ответ

2

по моему разумению вы делаете df2-DF1 на Col3, вы можете попробовать

df2.set_index(['Col1', 'Col2', 'Col4', 'Col5']).sub(df1.set_index(['Col1', 'Col2', 'Col4', 'Col5']), fill_value=0).reset_index() 
+0

приветствует человека! было так просто, нужно понимать set_index() лучше .. спасибо – spiff

+0

Рад, что это помогло .. –

2

Если идентификаторы столбцов C1, C2, C4 и C5, вы можете установить их в качестве индекса и использовать .sub:

idx = ['Col1', 'Col2', 'Col4', 'Col5'] 

df2.set_index(idx).sub(df1.set_index(idx), fill_value=0) 
Out[16]: 
          Col3 
Col1 Col2 Col4 Col5   
1 ABC xxx apple  -23.0 
    DEF xxx apple  -24.0 
2 ABC yyy banana -40.0 
    PQR yyy banana  65.0 
3 ABC zzz pear  12.0 
    DEF zzz pear  10.0 
4 PQR mmm pineapple 26.0 

Вы можете позвонить reset_index в конце концов, тоже:

df2.set_index(idx).sub(df1.set_index(idx), fill_value=0).reset_index() 
Out[17]: 
    Col1 Col2 Col4  Col5 Col3 
0  1 ABC xxx  apple -23.0 
1  1 DEF xxx  apple -24.0 
2  2 ABC yyy  banana -40.0 
3  2 PQR yyy  banana 65.0 
4  3 ABC zzz  pear 12.0 
5  3 DEF zzz  pear 10.0 
6  4 PQR mmm pineapple 26.0 
+0

спасибо vm .. думаю, @aakash_makwana делает то же самое в одной строке? поэтому согласились с тем, что – spiff

+0

Конечно, возможна также одна линия. Я думал, что это более читаемо. Добро пожаловать. :) – ayhan

+0

вы действительно правы, это более читаемо – spiff

Смежные вопросы