rohi
rohi

Reputation: 305

Add commas to decimal column without rounding off

I have pandas column named Price_col. which look like this.

       Price_col
    1. 1000000.000
    2. 234556.678900
    3. 2345.00
    4.
    5. 23.56

I am trying to add commas to my Price_col to look like this.

       Price_col
    1. 1,000,000.000
    2. 234,556.678900
    3. 2,345.00
    4.
    5. 23.56

when I try convert the values it always round off. is there way that I can have original value without rounding off.

I tried below code. this what I got for the value 234556.678900.

n = "{:,}".format(234556.678900)
print(n)
>>> 234,556.6789

Upvotes: 1

Views: 273

Answers (2)

ti7
ti7

Reputation: 18930

From your comment, I realized you may really want something else as described in How to display pandas DataFrame of floats using a format string for columns? and only change the view of the data

Creating a new string column formatted as a string

>>> df = pd.DataFrame({"Price_col": [1000000.000, 234556.678900, 2345.00, None, 23.56]}
>>> df["price2"] = df["Price_col"].apply(lambda x: f"{x:,f}")
>>> df
      Price_col            price2
0  1000000.0000  1,000,000.000000
1   234556.6789    234,556.678900
2     2345.0000      2,345.000000
3           NaN               nan
4       23.5600         23.560000
>>> df.dtypes
Price_col    float64
price2        object
dtype: object

Temporarily changing how data is displayed

>>> df = pd.DataFrame({"Price_col": [1000000.000, 234556.678900, 2345.00, None, 23.56]}
>>> print(df)
      Price_col
0  1000000.0000
1   234556.6789
2     2345.0000
3           NaN
4       23.5600
>>> with pd.option_context('display.float_format', '€{:>18,.6f}'.format):
...     print(df)
... 
            Price_col
0 €  1,000,000.000000
1 €    234,556.678900
2 €      2,345.000000
3                 NaN
4 €         23.560000
>>> print(df)
      Price_col
0  1000000.0000
1   234556.6789
2     2345.0000
3           NaN
4       23.5600

Upvotes: 1

ti7
ti7

Reputation: 18930

Add f for fixed-point

>>> "{:,}".format(234556.678900)
'234,556.6789'
>>> "{:,f}".format(234556.678900)
'234,556.678900'

You can also control the precision with .p where p is the number of digits (and should probably do so) .. beware, as you're dealing with floats, you'll have some IEEE 754 aliasing, though representation via format should be quite nice regardless of the backing data

>>> "{:,.5f}".format(234556.678900)
'234,556.67890'
>>> "{:,.20f}".format(234556.678900)
'234,556.67889999999897554517'

The full Format Specification Mini-Language can be found here:
https://docs.python.org/3/library/string.html#format-specification-mini-language

Upvotes: 3

Related Questions