will
will

Reputation: 35

How do I round values in a column based on integers in another column

I need to round prices in a column to different number of decimals in Python. I am using this code to create the dataframe, df_prices:

    df_prices = pd.DataFrame({'InstrumentID':['001','002','003','004','005','006'], 'Price':[12.44,6.5673,23.999,56.88,4333.22,27.8901],'RequiredDecimals':[2,0,1,2,0,3]})

The data looks like this:

InstrumentID    Price      RequiredDecimals  
1              12.444     2  
2              6.5673     0  
3              23.999     1  
4              56.88      2  
5              4333.22    0  
6              27.8901    3  

I often get this issue returned:

TypeError: cannot convert the series to

Neither of these statements worked:

    df_prices['PriceRnd'] = np.round(df_prices['Price'] , df_prices['RequiredDecimals'])

    df_prices['PriceRnd'] = df_prices['Price'].round(decimals = df_prices['RequiredDecimals'] )

This is what the final output should look like:

Instrument#    Price      RequiredDecimals     PriceRnd  
1              12.444     2                    12.44  
2              6.5673     0                    7  
3              23.999     1                    24.0  
4              56.88      2                    56.88  
5              4333.22    0                    4333   
6              27.8901    3                    27.890

Upvotes: 0

Views: 403

Answers (4)

Christian Sloper
Christian Sloper

Reputation: 7510

An alternative using the pandas round function on the series by exploiting transpositions.

You can do this:

df_prices[['Price']].T.round(df_prices.RequiredDecimals.to_dict()).T

Upvotes: 0

will
will

Reputation: 35

An alternative way would be to adjust the number that you are trying to round with an appropriate factor and then use the fact that the .round()-function always rounds to the nearest integer.
df_prices['factor'] = 10**df_prices['RequiredDecimals'] df_prices['rounded'] = (df_prices['Price'] * df_prices['factor']).round() / df_prices['factor']
After rounding, the number is divided again by the factor.

Upvotes: 0

Axois
Axois

Reputation: 2061

Although not elegant, you can try this.

import pandas as pd
df_prices = pd.DataFrame({'InstrumentID':['001','002','003','004','005','006'], 'Price':[12.44,6.5673,23.999,56.88,4333.22,27.8901],'RequiredDecimals':[2,0,1,2,0,3]})
print(df_prices)
list1 = []
for i in df_prices.values:
    list1.append('{:.{}f}' .format(i[1], i[2]))
print(list1)
df_prices["Rounded Price"] =list1
print(df_prices)

  InstrumentID      Price  RequiredDecimals Rounded Price
0          001    12.4400                 2         12.44
1          002     6.5673                 0             7
2          003    23.9990                 1          24.0
3          004    56.8800                 2         56.88
4          005  4333.2200                 0          4333
5          006    27.8901                 3        27.890

or a 1-liner code

df_prices['Rnd'] = ['{:.{}f}' .format(x, y) for x,y inzip(df_prices['Price'],df_prices['RequiredDecimals'])]

Upvotes: 1

Hryhorii Pavlenko
Hryhorii Pavlenko

Reputation: 3910

Couldn't find a better solution, but this one seems to work

df['Rnd'] = [np.around(x,y) for x,y in zip(df['Price'],df['RequiredDecimals'])]

Upvotes: 1

Related Questions