Kevin
Kevin

Reputation: 2301

Pandas round is not working for DataFrame

Round works on a single element but not the DataFrame, tried DataFrame.round() but didn't work... any idea? Thanks.

Have code below:

print "Panda Version: ", pd.__version__
print "['5am'][0]: ", x3['5am'][0]
print "Round element: ", np.round(x3['5am'][0]*4) /4
print "Round Dataframe: \r\n", np.round(x3 * 4, decimals=2) / 4
df = np.round(x3 * 4, decimals=2) / 4
print "Round Dataframe Again: \r\n", df.round(2)

Got result:

Panda Version:  0.18.0
['5am'][0]:  0.279914529915
Round element:  0.25
Round Dataframe:
                 5am       6am      7am      8am      9am     10am     11am
Date
2016-07-11  0.279915  0.279915  2.85256  4.52778  6.23291  9.01496  8.53632
2016-07-12  0.339744  0.369658  2.67308  4.52778  5.00641  7.30983  6.98077
2016-07-13  0.399573  0.459402  2.61325  3.83974  5.48504  6.77137  5.24573
2016-07-14  0.339744  0.549145  2.64316  3.36111  5.66453  5.96368  7.87821
2016-07-15  0.309829  0.459402  2.55342  4.64744  4.46795  6.80128  6.17308
2016-07-16      0.25  0.369658  2.46368  2.67308  4.58761  6.35256  5.63462
2016-07-17  0.279915  0.369658  2.58333  2.91239  4.19872  5.51496  6.65171
Round Dataframe Again:
                 5am       6am      7am      8am      9am     10am     11am
Date
2016-07-11  0.279915  0.279915  2.85256  4.52778  6.23291  9.01496  8.53632
2016-07-12  0.339744  0.369658  2.67308  4.52778  5.00641  7.30983  6.98077
2016-07-13  0.399573  0.459402  2.61325  3.83974  5.48504  6.77137  5.24573
2016-07-14  0.339744  0.549145  2.64316  3.36111  5.66453  5.96368  7.87821
2016-07-15  0.309829  0.459402  2.55342  4.64744  4.46795  6.80128  6.17308
2016-07-16      0.25  0.369658  2.46368  2.67308  4.58761  6.35256  5.63462
2016-07-17  0.279915  0.369658  2.58333  2.91239  4.19872  5.51496  6.65171

Upvotes: 32

Views: 59659

Answers (6)

BSalita
BSalita

Reputation: 8971

Similar issue. df.round(1) didn't round as expected (e.g. .400000000123) but df.astype('float64').round(1) worked. Significantly, the dtype of df is float32. Apparently round() doesn't work properly on float32. How is this behavior not a bug?

Upvotes: 6

Catlover
Catlover

Reputation: 399

As I just found here,

"round does not modify in-place. Rather, it returns the dataframe rounded."

It might be helpful to think of this as follows:

df.round(2) is doing the correct rounding operation, but you are not asking it to see the result or saving it anywhere.

Thus, df_final = df.round(2) will likely complete your expected functionality, instead of just df.round(2). That's because the results of the rounding operation are now being saved to the df_final dataframe.

Additionally, it might be best to do one additional thing and use df_final = df.round(2).copy() instead of simply df_final = df.round(2). I find that some things return unexpected results if I don't assign a copy of the old dataframe to the new dataframe.

Upvotes: 1

Naresh Abburi
Naresh Abburi

Reputation: 259

as simple as this

df['col_name'] = df['col_name'].astype(float).round(2)

Upvotes: 24

user3217125
user3217125

Reputation: 649

Try to cast to float type:

x3.astype(float).round(2)

Upvotes: 48

MaxU - stand with Ukraine
MaxU - stand with Ukraine

Reputation: 210982

Explanation of your code:

In [166]: np.round(df * 4, decimals=2)
Out[166]:
      a     b     c     d
0  0.11  0.45  1.65  3.38
1  3.97  2.90  1.89  3.42
2  1.46  0.79  3.00  1.44
3  3.48  2.33  0.81  1.02
4  1.03  0.65  1.94  2.92
5  1.88  2.21  0.59  0.39
6  0.08  2.09  4.00  1.02
7  2.86  0.71  3.56  0.57
8  1.23  1.38  3.47  0.03
9  3.09  1.10  1.12  3.31

In [167]: np.round(df * 4, decimals=2) / 4
Out[167]:
        a       b       c       d
0  0.0275  0.1125  0.4125  0.8450
1  0.9925  0.7250  0.4725  0.8550
2  0.3650  0.1975  0.7500  0.3600
3  0.8700  0.5825  0.2025  0.2550
4  0.2575  0.1625  0.4850  0.7300
5  0.4700  0.5525  0.1475  0.0975
6  0.0200  0.5225  1.0000  0.2550
7  0.7150  0.1775  0.8900  0.1425
8  0.3075  0.3450  0.8675  0.0075
9  0.7725  0.2750  0.2800  0.8275

In [168]: np.round(np.round(df * 4, decimals=2) / 4, 2)
Out[168]:
      a     b     c     d
0  0.03  0.11  0.41  0.84
1  0.99  0.72  0.47  0.86
2  0.36  0.20  0.75  0.36
3  0.87  0.58  0.20  0.26
4  0.26  0.16  0.48  0.73
5  0.47  0.55  0.15  0.10
6  0.02  0.52  1.00  0.26
7  0.72  0.18  0.89  0.14
8  0.31  0.34  0.87  0.01
9  0.77  0.28  0.28  0.83

This is working properly for me (pandas 0.18.1)

In [162]: df = pd.DataFrame(np.random.rand(10,4), columns=list('abcd'))

In [163]: df
Out[163]:
          a         b         c         d
0  0.028700  0.112959  0.412192  0.845663
1  0.991907  0.725550  0.472020  0.856240
2  0.365117  0.197468  0.750554  0.360272
3  0.870041  0.582081  0.203692  0.255915
4  0.257433  0.161543  0.483978  0.730548
5  0.470767  0.553341  0.146612  0.096358
6  0.020052  0.522482  0.999089  0.254312
7  0.714934  0.178061  0.889703  0.143701
8  0.308284  0.344552  0.868151  0.007825
9  0.771984  0.274245  0.280431  0.827999

In [164]: df.round(2)
Out[164]:
      a     b     c     d
0  0.03  0.11  0.41  0.85
1  0.99  0.73  0.47  0.86
2  0.37  0.20  0.75  0.36
3  0.87  0.58  0.20  0.26
4  0.26  0.16  0.48  0.73
5  0.47  0.55  0.15  0.10
6  0.02  0.52  1.00  0.25
7  0.71  0.18  0.89  0.14
8  0.31  0.34  0.87  0.01
9  0.77  0.27  0.28  0.83

Upvotes: 3

OmerBA
OmerBA

Reputation: 842

I've tried to reproduce your situation. and it seems to work nicely.

import pandas as pd
import numpy as np

from io import StringIO

s = """Date 5am       6am      7am      8am      9am     10am     11am
2016-07-11  0.279915  0.279915  2.85256  4.52778  6.23291  9.01496  8.53632
2016-07-12  0.339744  0.369658  2.67308  4.52778  5.00641  7.30983  6.98077
2016-07-13  0.399573  0.459402  2.61325  3.83974  5.48504  6.77137  5.24573
2016-07-14  0.339744  0.549145  2.64316  3.36111  5.66453  5.96368  7.87821
2016-07-15  0.309829  0.459402  2.55342  4.64744  4.46795  6.80128  6.17308
2016-07-16      0.25  0.369658  2.46368  2.67308  4.58761  6.35256  5.63462
2016-07-17  0.279915  0.369658  2.58333  2.91239  4.19872  5.51496  6.65171
"""

df = pd.read_table(StringIO(s), delim_whitespace=True)
df.set_index('Date').round(2)

Upvotes: 0

Related Questions