Вычитание двух мультииндексированных фреймов данных на основе обоих индексов - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть два кадра данных, которые выглядят примерно так:

df1 = 
          val
id1 id2
foo  1     50
     2    100
     4    200
bar  1     25
     4    100
     8    200
baz  2     75
     4    150


df2 = 
          val
id1 id2
foo  1     60
     2    200
     3    100
bar  1     50
     4    101
     8    202
baz  2     70
     5    155

Я пытаюсь создать новый фрейм данных, который сравнивает оба индекса и вычитает столбец val, только если оба индекса совпадают.

Как генерировать данные:

import pandas as pd
d1 = {'id1':['foo','foo', 'foo', 'bar', 'bar', 'bar','baz', 'baz'],
   'id2':[1, 2, 4, 1, 4, 8, 2, 4], 
   'val':[50, 100, 200, 25, 100, 200, 75, 150]}
df1 = pd.DataFrame(data=d1)
df1.set_index(['id1', 'id2'], inplace=True)

import pandas as pd
d2 = {'id1':['foo','foo', 'foo', 'bar', 'bar', 'bar','baz', 'baz'],
   'id2':[1, 2, 3, 1, 4, 8, 2, 5], 
   'val':[60, 200, 100, 50, 101, 202, 70, 155]}
df2 = pd.DataFrame(data=d2)
df2.set_index(['id1', 'id2'], inplace=True)

Я довольно новичок в python, и мультииндексы - это проклятие моей жизни прямо сейчас.

1 Ответ

0 голосов
/ 11 сентября 2018

вы можете напрямую вычесть два кадра данных.Это вычтет значение, где индексы совпадают.

как показано ниже,

res=df1-df2

Вывод:

           val
id1 id2       
bar 1    -25.0
    4     -1.0
    8     -2.0
baz 2      5.0
    4      NaN
    5      NaN
foo 1    -10.0
    2   -100.0
    3      NaN
    4      NaN
           val

Если вы хотите видеть только совпадающие записи, попробуйте, как показано ниже,

res[res['val'].notnull()]

Вывод:

id1 id2       
bar 1    -25.0
    4     -1.0
    8     -2.0
baz 2      5.0
foo 1    -10.0
    2   -100.0

для получения более подробной информации перейдите по этой ссылке мультииндексация

Если у вас несколько столбцов и вы хотите выполнить вычитание для одного столбца, используйте ниже

df1['res']=df1['val']-df2['val']

Вывод:

         val    res
id1 id2            
foo 1     50  -10.0
    2    100 -100.0
    4    200    NaN
bar 1     25  -25.0
    4    100   -1.0
    8    200   -2.0
baz 2     75    5.0
    4    150    NaN

Этот фрагмент кода выполняет вычитание для столбца val и сохраняет его в новом столбце с именем res

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...