Python pandas how to use a lamda function to convert duplicated code in 1 line

Viewed 57

I have a pandas python code like this:

def mul3(df):
    df['mul31'] = df['tpx1'].values * df['tqy1'].values * df['vtin1'].values * df[
        'slife1'].values
    df['mul32'] = df['tpx2'].values * df['tqy2'].values * df['vtin2'].values * df[
        'slife1'].values
    df['mul33'] = df['tpx3'].values * df['tqy3'].values * df['vtin3'].values * df[
        'slife1'].values
    df['mul34'] = df['tpx4'].values * df['tqy4'].values * df['vtin4'].values * df[
        'slife1'].values
    df['mul35'] = df['tpx5'].values * df['tqy5'].values * df['vtin5'].values * df[
        'slife1'].values
    return df

Is there anyway I can use a lamda function to replace it to 1 line code? Any friend can help?

3 Answers

You could probably do it like this:

N = 5
df[[f'mul3{i}' for i in range(1, N+1)]] = [df[f'tpx{i}'].values * df[f'tqy{i}'].values * df[f'vtin{i}'].values * df['slife1'].values for i in range(1, N+1)]

This is exactly like @richardec's solution. The only difference is it uses a dict comprehension and assign.

df = df.assign(**{f'mul3{i}': df[f'tpx{i}'] * df[f'tqy{i}'] * df[f'vtin{i}'] * df['slife1'] for i in range(1,6)})

Not a one-liner but much more readable

func = lambda df, num : df[f'tpx{num}'].values * df[f'tqy{num}'].values * df[f'vtin{num}'].values * df[f'slife1'].values
for i in range(5):
    df[f'mul3{i}'] = func(df, i)
Related