pandas rounding when converting float to integer

You are right, astype(int) does a conversion toward zero:

‘integer’ or ‘signed’: smallest signed int dtype

from pandas.to_numeric documentation (which is linked from astype() for numeric conversions).

If you want to round, you need to do a float round, and then convert to int:

df.round(0).astype(int)

Use other rounding functions, according your needs.


There is a potential that NA as a float type exists in the dataframe. so an alternative solution is: df.fillna(0).astype('int')


In case the data frame contains both, numeric and non-numeric values and you only want to touch numeric fields:

df = df.applymap(lambda x: int(round(x, 0)) if isinstance(x, (int, float)) else x)

If I understand right you could just perform the rounding operation followed by converting it to an integer?

s1 = pd.Series([1.2,2.9])
s1 = s1.round().astype(int)

Which gives the output:

0    1
1    3
dtype: int32