You have a few options...
1) convert everything to integers.
df.astype(int)
<=35 >35
Cut-off
Calcium 0 1
Copper 1 0
Helium 0 8
Hydrogen 0 1
2) Use round:
>>> df.round()
<=35 >35
Cut-off
Calcium 0 1
Copper 1 0
Helium 0 8
Hydrogen 0 1
but not always great...
>>> (df - .2).round()
<=35 >35
Cut-off
Calcium -0 1
Copper 1 -0
Helium -0 8
Hydrogen -0 1
3) Change your display precision option in Pandas.
pd.set_option('precision', 0)
>>> df
<=35 >35
Cut-off
Calcium 0 1
Copper 1 0
Helium 0 8
Hydrogen 0 1
Answer from Alexander on Stack OverflowYou have a few options...
1) convert everything to integers.
df.astype(int)
<=35 >35
Cut-off
Calcium 0 1
Copper 1 0
Helium 0 8
Hydrogen 0 1
2) Use round:
>>> df.round()
<=35 >35
Cut-off
Calcium 0 1
Copper 1 0
Helium 0 8
Hydrogen 0 1
but not always great...
>>> (df - .2).round()
<=35 >35
Cut-off
Calcium -0 1
Copper 1 -0
Helium -0 8
Hydrogen -0 1
3) Change your display precision option in Pandas.
pd.set_option('precision', 0)
>>> df
<=35 >35
Cut-off
Calcium 0 1
Copper 1 0
Helium 0 8
Hydrogen 0 1
Since pandas 0.17.1 you can set the displayed numerical precision by modifying the style of the particular data frame rather than setting the global option:
import pandas as pd
import numpy as np
np.random.seed(24)
df = pd.DataFrame(np.random.randn(5, 3), columns=list('ABC'))
df

df.style.set_precision(2)

It is also possible to apply column specific styles
df.style.format({
'A': '{:,.1f}'.format,
'B': '{:,.3f}'.format,
})

You need to re-assign dataframe
(which is, what I suppose your error is):
>>> import pandas as pd
>>> df = pd.DataFrame(data={"col": [24.00, 2.00, 3.00]})
>>> df.dtypes
col float64
dtype: object
>>> df
col
0 24.0
1 2.0
2 3.0
>>> df=df.astype(int)
>>> df
col
0 24
1 2
2 3
>>> df.dtypes
col int32
dtype: object
You can solve this by setting the pandas option, precision to 0.
import pandas as pd
df = pd.DataFrame(data={"col": [24.00, 2.00, 3.00]})
print(df)
col
0 24.0
1 2.0
2 3.0
pd.set_option('precision',0)
print(df)
col
0 24
1 2
2 3
my boyfriend has moved his excel table to python but it has added .0 to his values (eg 160 becomes 160.0) is there anyway to fix this and remove decimals ?
I need to remove decimals from float to get 6 characters after the dot WITHOUT rounding For example I have 0.00655379 and I need to get 0.006553
The following would preserve all digits and just get rid of the final decimal point which is what you wanted:
In [80]:
t="""val
1.2345.678"""
df = pd.read_csv(io.StringIO(t))
df
Out[80]:
val
0 1.2345.678
In [94]:
(df['val'].str[0:df['val'].str.rfind('.')[0]]+df['val'].str.split('.').str[-1]).astype(np.float64)
Out[94]:
0 1.234568
dtype: float64
Note that the above shows a display truncation, the full value is present
So the above slices your string from beginning to the position of the last decimal point, I then split the string and add the last split, you can then convert to a float using astype
EDIT
A better way I think is for the second part not to split but rather re-use rfind for the positioning:
In [113]:
df['val'].str[0:df['val'].str.rfind('.')[0]]+df['val'].str[df['val'].str.rfind('.')[0]+1:]
Out[113]:
0 1.2345678
Name: val, dtype: object
y2 = df['Press P'].str.split('.').str[:-1].str.join('.')
I got the solution.
Thanks for your support.
Joey
Use a function and apply to whole column:
In [94]:
df = pd.DataFrame({'Movies':['Save the last dance', '2012.0']})
df
Out[94]:
Movies
0 Save the last dance
1 2012.0
[2 rows x 1 columns]
In [95]:
def trim_fraction(text):
if '.0' in text:
return text[:text.rfind('.0')]
return text
df.Movies = df.Movies.apply(trim_fraction)
In [96]:
df
Out[96]:
Movies
0 Save the last dance
1 2012
[2 rows x 1 columns]
Here is hint for you ,
In case of Valid number ,
a="2012.0"
try:
a=float(a)
a=int(a)
print a
except:
print a
Output:
2012
In case of String like "Dance with Me"
a="Dance with Me"
try:
a=float(a)
a=int(a)
print a
except:
print a
Output:
Dance with Me
You can try using as df['col'] = (df['col']*100).astype(int)
as below:
df = pd.DataFrame({'col': [1.10, 2.20, 3.30, 4.40]})
df['col'] = (df['col']*100).astype(int)
print(df)
Output:
col
0 110
1 220
2 330
3 440
If - as your comment suggests - the data just all needs to be multiplied by 100...
df['columnName'] = df['columnName'].apply(lambda x: x*100)
You can call int() on the end result:
>>> int(2.0)
2
When a number as a decimal it is usually a float in Python.
If you want to remove the decimal and keep it an integer (int). You can call the int() method on it like so...
>>> int(2.0)
2
However, int rounds down so...
>>> int(2.9)
2
If you want to round to the nearest integer you can use round:
>>> round(2.9)
3.0
>>> round(2.4)
2.0
And then call int() on that:
>>> int(round(2.9))
3
>>> int(round(2.4))
2
You can convert the type with .astype
In [312]: df.columns = df.columns.astype(int)
In [313]: df
Out[313]:
2006 2007 2008 2009
0 foo foo bar bar
1 foo foo bar bar
Or use .map and convert to string type.
In [338]: df.columns.map('{:g}'.format)
Out[338]: Index(['2006', '2007', '2008', '2009'], dtype='object')
In [319]: df.columns.map(int)
Out[319]: Int64Index([2006, 2007, 2008, 2009], dtype='int64')
You can convert to float before converting to int and then str:
df.columns = df.columns.values.astype(float).astype(int).astype(str)
print(df.columns)
Index(['2006', '2007', '2008', '2009'], dtype='object')
Seems long-winded, but at least we are working with the underlying NumPy array.