Una versión abreviada de mi marco de datos se ve así:
df_crop = pd.DataFrame({ 'Name' : ['Crop1', 'Crop1', 'Crop1', 'Crop1', 'Crop2', 'Crop2', 'Crop2', 'Crop2'], 'Type' : ['Area', 'Diesel', 'Fert', 'Pest', 'Area', 'Diesel', 'Fert', 'Pest'], 'GHG': [14.9, 0.0007, 0.145, 0.1611, 2.537, 0.011, 0.1825, 0.115], 'Acid': [0.0125, 0.0005, 0.0029, 0.0044, 0.013, 0.00014, 0.0033, 0.0055], 'Terra Eutro': [0.053, 0.0002, 0.0077, 0.0001, 0.0547, 0.00019, 0.0058, 0.0002] })Ahora necesito normalizar todos los valores en el marco de datos con rendimiento, que es diferente por cultivo, pero no por Tipo:
s_yield = pd.Series([0.388, 0.4129], index=['Crop1', 'Crop2']) Necesito conservar la información en 'Tipo'. Si trato de usar .mul() , recibo un error debido a los índices duplicados: ValueError: cannot reindex from a duplicate axis .
La única otra idea que tengo es usar .loc() pero tengo muchas columnas (16 con valores para normalizar) y no se me ocurrió nada eficiente. ¿Alguna sugerencia?
Editar : la siguiente tabla podría ayudar a mostrar lo que trato de lograr: 
Obtenga los datos numéricos y multiplique usando la serie
numeric_df = df_crop.select_dtypes('number') df_crop[numeric_df.columns] = numeric_df.mul(df_crop.Name.map(s_yield), axis=0)Producción
Name Type GHG Acid Terra Eutro 0 Crop1 Area 5.781200 0.004850 0.020564 1 Crop1 Diesel 0.000272 0.000194 0.000078 2 Crop1 Fert 0.056260 0.001125 0.002988 3 Crop1 Pest 0.062507 0.001707 0.000039 4 Crop2 Area 1.047527 0.005368 0.022586 5 Crop2 Diesel 0.004542 0.000058 0.000078 6 Crop2 Fert 0.075354 0.001363 0.002395 7 Crop2 Pest 0.047483 0.002271 0.000083A partir de pandas 0.24.0, puede fusionar series en un marco de datos directamente siempre que se nombre la serie:
df_merged = df_crop.merge(s_yield.rename('yield'), left_on = 'Name', right_index = True)luego multiplique las columnas según sea necesario.
Puede usar s_yield.map para extender la Serie a la longitud del marco de datos, y puede usar df.select_dtypes para encontrar todas las columnas de un tipo de dtipo específico y múltiples en ellas:
cols = df_crop.select_dtypes('number').columns df_crop[cols] = df_crop[cols].mul(df_crop['Name'].map(s_yield), axis=0)Producción:
>>> df_crop Name Type GHG Acid Terra Eutro 0 Crop1 Area 5.781200 0.004850 0.020564 1 Crop1 Diesel 0.000272 0.000194 0.000078 2 Crop1 Fert 0.056260 0.001125 0.002988 3 Crop1 Pest 0.062507 0.001707 0.000039 4 Crop2 Area 1.047527 0.005368 0.022586 5 Crop2 Diesel 0.004542 0.000058 0.000078 6 Crop2 Fert 0.075354 0.001363 0.002395 7 Crop2 Pest 0.047483 0.002271 0.000083