Multiplica dos columnas de diferentes marcos de datos en Python

Resuelto Frank asked hace 9 meses • 0 respuestas

Tengo dos marcos de datos (ambos son de tipo flotante). El primero se llama Pricesy contiene solo precios:

df Precios

El segundo se llama Table_ScenarioPercentagesy contiene porcentajes donde los precios deben multiplicarse por:

df Porcentajes de escenario_tabla

Entonces, lo que quiero hacer es multiplicar el valor del Período 20240201 (Precios) por el Mes 0 (Table_ScenarioPercentages), el valor del Período 20240301 (Precios) por el Mes 1 (Table_ScenarioPercentages), etc.

He intentado:

Prices.iloc[:, 0]*Table_ScenarioPercentages.iloc[:, 0] 

pero esto solo da muchos NaN y el formato incorrecto:

multiplicación de resultados

¿Alguien sabe cómo hacer esto en Python?

Frank avatar Feb 16 '24 21:02 Frank
Aceptado

TL;DR

UsarPrices['DATED BRENT']*Table_ScenarioPercentages['Supply Side Shock Up - Crude'].values


Según los documentos de pd.Series(cursiva mía):

Las operaciones entre series (+, -, /, *, **) alinean los valores según sus valores de índice asociados

Dado que los índices para ambos dfs ( 20240201, 20240301, ...y 0, 1, ...) comparten valores 0 , terminará con una nueva Serie con los valores de índice de ambos y NaNvalores como resultado de some value * NaNo viceversa para cada valor de índice.

Si desea multiplicar en la posición del índice , use Series.valuespara obtener un ndarray (o use:) Series.to_numpy. NB: en este caso, ambas series deben tener la misma longitud.

Muestra de datos

import pandas as pd

df1 = pd.DataFrame({'Col1': [20, 10]}, index=[1, 'A'])
df2 = pd.DataFrame({'Col2': [10, 20]})

print(df1)

   Col1
1    20
A    10

print(df2)

   Col2
0    10
1    20

Multiplicación basada en índices (cf. resultado no deseado de OP )

print(df1['Col1']*df2['Col2'])

0      NaN    # NaN * 10 (0 not in `df.index`)
1    400.0    # 20 * 20 (1 in both indices)
A      NaN    # 10 * NaN ('A' not in `df2.index`)
dtype: float64

Multiplicación por posición de índice (deseada, con Series.values)

print(df1['Col1']*df2['Col2'].values)

1    200    # 20 * 10
A    200    # 10 * 20
Name: Col1, dtype: int64
ouroboros1 avatar Feb 17 '2024 13:02 ouroboros1