Как выполнить вычисление, используя 2 строки из мультииндекса df и добавить результат в качестве новой строки? - PullRequest
1 голос
/ 04 апреля 2019

У меня есть многоиндексный df, подобный этому:

                 foo  bar  now
2018-01-01 row1    0    1    2
           row2    3    4    5
           row3    6    7    8
           row4    9   10   11
2018-01-02 row1   12   13   14
           row2   15   16   17
           row3   18   19   20
           row4   21   22   23
2018-01-03 row1   24   25   26
           row2   27   28   29
           row3   30   31   32
           row4   33   34   35

Я хотел бы добавить новую строку5 со значениями из расчета, выполненного с использованием других строк уровня 1, например: строка1 * строка3.

Результат шага расчета должен быть:

                 foo  bar  now
2018-01-01 row5    0    7   16
2018-01-02 row5   etc..
2018-01-03 row5   etc..

И после добавления новых строк к оригиналу результирующий df будет выглядеть так:

                 foo  bar  now
2018-01-01 row1    0    1    2
           row2    3    4    5
           row3    6    7    8
           row4    9   10   11
           row5    0    7   16
2018-01-02 row1   12   13   14
           row2   15   16   17
           row3   18   19   20
           row4   21   22   23
           row5   etc...
2018-01-03 row1   24   25   26
           row2   27   28   29
           row3   30   31   32
           row4   33   34   35
           row5   etc...

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

df.loc[pd.IndexSlice[:,:], :] * df.loc[pd.IndexSlice[:,:], :]

Я не думаю, что вещание будет работать, поэтому я собиралсяпопробовать цикл, но я не смог заставить вычисления работать (возвращает df со строками row1 и row3 как все NaN):

df.loc[pd.IndexSlice['2018-01-01', 'row1'], :] * df.loc[pd.IndexSlice['2018-01-01', 'row3'], :]

Заранее спасибо за любые решения,советы, ресурсы для ссылки:)

Ответы [ 2 ]

1 голос
/ 04 апреля 2019

Вот один из способов

s=df.loc[pd.IndexSlice[:,'row1'],:]*df.loc[pd.IndexSlice[:,'row3'],:].values
s=s.reset_index(level=1).assign(level_1='row5').set_index('level_1',append=True)
pd.concat([df,s]).sort_index()
                 foo  bar  now
2018-01-01 row1    0    1    2
           row2    3    4    5
           row3    6    7    8
           row4    9   10   11
           row5    0    7   16
2018-01-02 row1   12   13   14
           row2   15   16   17
           row3   18   19   20
           row4   21   22   23
           row5  216  247  280
2018-01-03 row1   24   25   26
           row2   27   28   29
           row3   30   31   32
           row4   33   34   35
           row5  720  775  832
1 голос
/ 04 апреля 2019

Вы можете выполнить расчет с выравниванием на первом уровне индекса, вручную назначив второй уровень, а затем объединяя и сортируя:

import pandas as pd

idx = pd.IndexSlice
newdf = ((df.loc[idx[:, 'row1'], :].reset_index(level=1, drop=True)
          *df.loc[idx[:, 'row3'], :].reset_index(level=1, drop=True))
          .assign(idx1='row5')
          .set_index('idx1', append=True)
          .rename_axis([None, None]))

df = pd.concat([df, newdf]).sort_index()

Вывод:

                 foo  bar  now
2018-01-01 row1    0    1    2
           row2    3    4    5
           row3    6    7    8
           row4    9   10   11
           row5    0    7   16
2018-01-02 row1   12   13   14
           row2   15   16   17
           row3   18   19   20
           row4   21   22   23
           row5  216  247  280
2018-01-03 row1   24   25   26
           row2   27   28   29
           row3   30   31   32
           row4   33   34   35
           row5  720  775  832
...