Derived from another question, here
I got a 2 million rows DataFrame, something similar to this
final_df = pd.DataFrame.from_dict({
    'ts':    [0,1,2,3,4,5],
    'speed': [5,4,1,4,1,4],
    'temp':  [9,8,7,8,7,8],
    'temp2':  [2,2,7,2,7,2],
    })
I need to run calculations with the values on each row and append the results as new columns, something similar to the question in this link.
I know that there a lot of combinations of speed, temp, and temp2 that are repeated if I drop_duplicates the resulting DataFrame is only 50k rows length, which takes significantly less time to process, using an apply function like this:
def dafunc(row):
    row['r1'] = row['speed'] * row['temp1'] * k1
    row['r2'] = row['speed'] * row['temp2'] * k2
nodup_df = final_df.drop_duplicates(['speed,','temp1','temp2'])
nodup_df = dodup_df.apply(dafunc,axis=1)
The above code is super simplified of what I actually do.
So far I'm trying to use a dictionary where I store the results and a string formed of the combinations is the key, if the dictionary already has those results, I get them instead of making the calculations again.
Is there a more efficient way to do this using Pandas' vectorized operations?
EDIT: In the end, the resulting DataFrame should look like this:
#assuming k1 = 0.5, k2 = 1
resulting_df = pd.DataFrame.from_dict({
        'ts':     [0,1,2,3,4,5],
        'speed':  [5,4,1,4,1,4],
        'temp':   [9,8,7,8,7,8],
        'temp2':  [2,2,7,2,7,2],
        'r1':     [22.5,16,3.5,16,3.5,16],
        'r2':     [10,8,7,8,7,8],
        })
 
     
    