[SOLVED] How to apply function to multiple columns based on value of another column?

Issue

Let’s say I have a dataframe as follow:

unit altitude_low altitude_high
meter 456 25435
meter 254 35223
feet 34 3256
feet 46 234
meter 456 45776

How do I convert the value of both altitude columns to meter if the unit column is feet?
I tried:

def convert_to_m(row):  
    if row['unit'] == "feet":
        row['altitude_low ']= row['altitude_low ']/3.281
        row['altitude_high']= row['altitude_high']/3.281 
    else:
        pass 

df= df.apply(lambda row: convert_to_m(row), axis= "columns")

but this failed.

Solution

You can use boolean indexing:

df.loc[df['unit'].eq('feet'), ['altitude_low','altitude_high']] /= 3.281

Output:

    unit  altitude_low  altitude_high
0  meter    456.000000   25435.000000
1  meter    254.000000   35223.000000
2   feet     10.362694     992.380372
3   feet     14.020116      71.319720
4  meter    456.000000   45776.000000

You can take the opportunity to change the unit as well:

mask = df['unit'].eq('feet')
df.loc[mask, ['altitude_low','altitude_high']] /= 3.281
df.loc[mask, 'unit'] = 'meter'

Output:

    unit  altitude_low  altitude_high
0  meter    456.000000   25435.000000
1  meter    254.000000   35223.000000
2  meter     10.362694     992.380372
3  meter     14.020116      71.319720
4  meter    456.000000   45776.000000

alternative approach for multiple units:

Use a dictionary with the conversion factors

units = {'feet': 1/3.281, 'meter': 1}

cols = ['altitude_low','altitude_high']
df[cols] = df[cols].mul(df['unit'].map(units), axis=0)

Answered By – mozway

Answer Checked By – Jay B. (BugsFixing Admin)

Leave a Reply

Your email address will not be published.