Pandas: последовательное умножение двух фреймов данных

#python #python-3.x #pandas #dataframe #multiplication

#python #python-3.x #pandas #фрейм данных #умножение

Вопрос:

У меня есть два фрейма данных; A содержит доли распределения, а B содержит почасовые объемы. Чтобы получить правильный объем для каждой шины за данный час, мне нужно умножить A на каждую строку фрейма данных B. Для данного часа (x) это было бы простым умножением A * B.loc[x] на .

 A =       col_a  col_b  col_c   col_d   col_e               
     0    0.0    0.0    0.0     0.0     1.0
     1    0.0    0.0    1.0     0.0     0.0
     2    0.0    1.0    0.0     0.5     0.0
     3    0.5    0.0    0.0     0.5     0.0
     4    0.5    0.0    0.0     0.0     0.0
 
 B =     col_a   col_b   col_c   col_d   col_e
    0   12881   598     154     180     0.0 
    1   12881   680     154     180     0.0
    2   11617   806     154     180     0.0
    3   12991   100     154     180     0.0
 

Тем не менее, я хочу выполнять это умножение для каждого часа одновременно и создавать большой многоиндексный фрейм данных C.

 C =          col_a   col_b  col_c  col_d  col_e
    hr  bus                     
    0   0    0.0     0.0    0.0    0.0   0.0
        1    0.0     0.0    154.0  0.0   0.0
        2    0.0     598.0  0.0    90.0  0.0
        3    6440.5  0.0    0.0    90.0  0.0
        4    6440.5  0.0    0.0    0.0   0.0
    1   0    0.0     0.0    0.0    0.0   0.0
        1    0.0     0.0    154.0  0.0   0.0
        2    0.0     680.0  0.0    90.0  0.0
 

Мне удалось создать этот фрейм данных с помощью операции со списком и перезаписать индекс результирующего фрейма данных. Я бы не считал это очень хорошей практикой и задался вопросом, есть ли лучший подход, который не требует перезаписи индекса?

 dfs = [A.mul(B.loc[i]) for i in B.index]
C = pandas.concat(dfs)

C.index = pandas.MultiIndex.from_product([B.index, A.index], names=['hr', 'bus'])
 

Ответ №1:

Сначала «реплицируйте» фрейм данных B, переформатируя индекс:

 BB = pd.DataFrame(np.repeat(B.values, A.index.size, axis=0), columns=B.columns,
    index=pd.MultiIndex.from_product((B.index, A.index), names=['hr', 'bus']))
 

Затем вычислите результат:

 result = A.mul(BB, level=1)
 

Результатом является:

          col_a  col_b  col_c  col_d  col_e
hr bus                                    
0  0       0.0    0.0    0.0    0.0    0.0
   1       0.0    0.0  154.0    0.0    0.0
   2       0.0  598.0    0.0   90.0    0.0
   3    6440.5    0.0    0.0   90.0    0.0
   4    6440.5    0.0    0.0    0.0    0.0
1  0       0.0    0.0    0.0    0.0    0.0
   1       0.0    0.0  154.0    0.0    0.0
   2       0.0  680.0    0.0   90.0    0.0
   3    6440.5    0.0    0.0   90.0    0.0
   4    6440.5    0.0    0.0    0.0    0.0
2  0       0.0    0.0    0.0    0.0    0.0
   1       0.0    0.0  154.0    0.0    0.0
   2       0.0  806.0    0.0   90.0    0.0
   3    5808.5    0.0    0.0   90.0    0.0
   4    5808.5    0.0    0.0    0.0    0.0
3  0       0.0    0.0    0.0    0.0    0.0
   1       0.0    0.0  154.0    0.0    0.0
   2       0.0  100.0    0.0   90.0    0.0
   3    6495.5    0.0    0.0   90.0    0.0
   4    6495.5    0.0    0.0    0.0    0.0