Structure arrays for broadcasting numpy python

Question:

I have a dataframe with is in long-format

import pandas as pd
import numpy as np


df = pd.DataFrame({'col1': [1], 'col2': [10]})

ratio = pd.Series([0.1, 0.70, 0.2])

# Expected Output

df_multiplied = pd.DataFrame({'col1': [0.1, 0.7, 0.2], 'col2': [1, 7, 2]})

My attempt was to convert it into numpy arrays and use np.tile

np.tile(df.T.values, len(df_ratio) * np.array(df_ratio).T

Is there any better way to do this?

Thank you!

Asked By: matt.aurelio

||

Answers:

Repeat the row n times where n is the ratio series’ length, then multiple along row axis by the ratio series:

>>> pd.concat([df]*ratio.shape[0], ignore_index=True).mul(ratio, axis='rows')

   col1  col2
0   0.1   1.0
1   0.7   7.0
2   0.2   2.0

Or, you can implement similar logic with numpy, repeat the array n times then multiply by ratio values with expanded dimension:

>>> np.repeat([df.values], ratio.shape[0], axis=1)*ratio.values[:,None]

array([[[0.1, 1. ],
        [0.7, 7. ],
        [0.2, 2. ]]])
Answered By: ThePyGuy
Categories: questions Tags: , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.