Панды рассчитывают разницу на двух фреймах данных со столбцами и несколькими индексами - PullRequest
1 голос
/ 02 июля 2019

У меня есть 2 кадра данных, df1:

         Jan17  Jun18  Dec18  Apr19
ID Name                            
0  Nick   10.0    1.7    3.7    0.0
1  Jack   10.0    0.0    2.8    3.5
2  Fox    10.0    1.7    0.0    0.0
3  Rex     1.0    0.0    3.0    4.2

второй DataFrame - df2:

          Jan17  Jun18  Dec18  Apr19
ID Name                             
0  Nick     5.0    1.7    2.0    0.0
1  Jack     6.0    0.0    0.8    3.5
2  Fox      8.0    5.0    0.0    0.0
3  Rex      1.0    0.0    1.0    4.2
4  Snack    3.1    9.0    2.8    4.4
5  Yosee    4.3    0.0    0.0    4.3
6  Petty    0.5    1.3    2.8    3.5
7  Lind     3.6    7.5    2.8    4.3
8  Korr     0.6    1.5    1.8    2.3

Результат df3:

ID   Name        Jan17  Jun18    Dec18    Apr19  
 0   Nick         5.0      0      1.7      0    
 1   Jack         4.0      0      2.0      0              
 2   Fox          2.0      -3.3   0        0    
 3   Rex          0        0      2.0      0  

Как рассчитать разницу между столбцами в df1 и df2 на основе мультииндексов: [ID, Name] из df1 и сохранить результат в df3?

Буду признателен за любую идею. Спасибо!

Ответы [ 3 ]

2 голосов
/ 02 июля 2019

Вы можете просто сделать

df1-df2.loc[df1.index]

Вывод:

         Jan17  Jun18  Dec18  Apr19
ID Name                            
0  Nick    5.0    0.0    1.7    0.0
1  Jack    4.0    0.0    2.0    0.0
2  Fox     2.0   -3.3    0.0    0.0
3  Rex     0.0    0.0    2.0    0.0
2 голосов
/ 02 июля 2019

Просто вычитайте, вычитание выравнивается по индексу.Вы можете переиндексировать df2 перед вычитанием, чтобы избежать значений NaN:

# df1 - df2.reindex(df1.index)
df1.sub(df2.reindex(df1.index))

         Jan17  Jun18  Dec18  Apr19
ID Name                            
0  Nick    5.0    0.0    1.7    0.0
1  Jack    4.0    0.0    2.0    0.0
2  Fox     2.0   -3.3    0.0    0.0
3  Rex     0.0    0.0    2.0    0.0

Обратите внимание, что причина, по которой я выбрал reindex over loc, заключалась в том, чтобы избежать KeyError s, если отсутствуют значения индекса.

В приведенном выше примере первое решение будет генерировать NaN, поэтому вы можете указать от fill_values до reindex, чтобы обеспечить возвращение df1 значения (а не NaN):

df2.reindex(df1.index, fill_value=0)

         Jan17  Jun18  Dec18  Apr19
ID Name                            
0  Nick    5.0    1.7    2.0    0.0
1  Jack    6.0    0.0    0.8    3.5
2  Fox     8.0    5.0    0.0    0.0
3  Rex     1.0    0.0    1.0    4.2
1 голос
/ 02 июля 2019

Попробуйте что-то новое

sum(df1.align(0-df2,join='left'))
Out[282]: 
         Jan17  Jun18  Dec18  Apr19
ID Name                            
0  Nick    5.0    0.0    1.7    0.0
1  Jack    4.0    0.0    2.0    0.0
2  Fox     2.0   -3.3    0.0    0.0
3  Rex     0.0    0.0    2.0    0.0
...