1

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.

1 Answer 1

1

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)
Sign up to request clarification or add additional context in comments.

2 Comments

holy moly thanks a lot dude! you solve my problem!
@anjelitodevan if you have multiple units, you can use a dictionary, see update ;)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.