#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