Операции с несколькими фреймами данных частично разделяют индексы в pandas - PullRequest
0 голосов
/ 08 марта 2020

У меня есть два кадра данных: (i) один имеет два индекса и два заголовка, и (ii) другой имеет один индекс и один заголовок. Второй уровень каждой оси в первом кадре данных относится к каждой оси второго кадра данных. Мне нужно умножить оба кадра данных на основе этого отношения между осями.

Кадр данных 1:

Dataframe 1

Кадр данных 2:

Dataframe 2

Ожидаемый результат (умножение на индекс / заголовок):

enter image description here

1 Ответ

1 голос
/ 08 марта 2020

Попробуйте использовать pd.DataFrame.mul с параметром level:

import pandas as pd

df = pd.DataFrame([[9,10,2,1,6,5],
                   [4, 0,3,4,6,6],
                   [9, 3,9,1,2,3],
                   [3, 5,9,3,9,0],
                   [4,4,8,5,10,5],
                   [5, 3,1,8,5,6]])

df.columns = pd.MultiIndex.from_arrays([[2020]*3+[2021]*3,[1,2,3,1,2,3]])

df.index = pd.MultiIndex.from_arrays([[1]*3+[2]*3,[1,2,3,1,2,3]])

print(df)
print('\n')
df2 = pd.DataFrame([[.1,.3,.6],[.4,.4,.3],[.5,.4,.1]], index=[1,2,3], columns=[1,2,3])

print(df2)
print('\n')
df_out = df.mul(df2, level=1)

print(df_out)

Выход:

   2020        2021       
       1   2  3    1   2  3
1 1    9  10  2    1   6  5
  2    4   0  3    4   6  6
  3    9   3  9    1   2  3
2 1    3   5  9    3   9  0
  2    4   4  8    5  10  5
  3    5   3  1    8   5  6


     1    2    3
1  0.1  0.3  0.6
2  0.4  0.4  0.3
3  0.5  0.4  0.1


    2020           2021          
       1    2    3    1    2    3
1 1  0.9  3.0  1.2  0.1  1.8  3.0
  2  1.6  0.0  0.9  1.6  2.4  1.8
  3  4.5  1.2  0.9  0.5  0.8  0.3
2 1  0.3  1.5  5.4  0.3  2.7  0.0
  2  1.6  1.6  2.4  2.0  4.0  1.5
  3  2.5  1.2  0.1  4.0  2.0  0.6
...