2016-08-16 10 views
2

У меня большой кадр данных в панде, Таблица A, со структурой, как показано ниже:Вычесть значение серии из кадра панды данных с учетом множественного индексом

 
key1 key2  value1 
1  201501  12  
2  201502  4  
3  201503  3  
4  201506  9  
5  201507  15 
6  201509  nan 

из таблицы А, Colum значение1, Я хочу, чтобы вычесть значение2 из таблицы B с Apperance, как показано ниже, используя key1 и Клавишу2 как присоединение ключей:

 
key1 key2  value2 
1  201501  11  
3  201503  2 
5  201507  14 

Я хочу следующее в таблице А,:

 
key1 key2  value1 
1  201501  1  
2  201502  4  
3  201503  1  
4  201506  9  
5  201507  1 
6  201509  nan 

Как я могу добиться этого в супер эффективный способ? Сегодня я объединил две таблицы и субстрат value1 в A с value2 от B, мои вопросы в том, что это можно сделать в более умном питонном стиле «look-up», который более гладкий и компактный?

код кадра данных ниже

import numpy as np 

tableA= pd.DataFrame({'key1':[1,2,3,4,5,6], 
       'key2':[201501,201502,201503,201506,201507,201509], 
       'value1':[12,4,3,9,15,np.nan] 
       }) 



tableB= pd.DataFrame({'key1':[1,3,5], 
       'key2':[201501,201503,201507], 
       'value1':[11,2,14] 
       }) 

ответ

1
tableA.set_index(keys).value1 \ 
    .sub(tableB.set_index(keys).value1, fill_value=0) \ 
    .reset_index() 

enter image description here

1

Вы можете создать DataFrames с MultiIndexes по set_index, а затем вычесть по sub и fillna первым DataFrame:

print (tableA.set_index(['key1','key2']) 
      .sub(tableB.set_index(['key1','key2'])) 
      .fillna(tableA.set_index(['key1','key2'])) 
      .reset_index()) 

    key1 key2 value1 
0  1 201501  1.0 
1  2 201502  4.0 
2  3 201503  1.0 
3  4 201506  9.0 
4  5 201507  1.0 
5  6 201509  NaN 

Другое решение с combine_first:

print (tableA.set_index(['key1','key2']) 
      .sub(tableB.set_index(['key1','key2'])) 
      .combine_first(tableA.set_index(['key1','key2'])) 
      .reset_index()) 

    key1 key2 value1 
0  1 201501  1.0 
1  2 201502  4.0 
2  3 201503  1.0 
3  4 201506  9.0 
4  5 201507  1.0 
5  6 201509  NaN 
+0

ли выше справедливы, если таблица А содержит несколько столбцов, кроме трех указанных? – swepab

+0

Затем используйте другое решение 'piRSquared'. – jezrael