Rishik
Rishik

Reputation: 123

I need to change the type of few columns in a pandas dataframe. Can't do so using iloc

In a dataframe with around 40+ columns I am trying to change dtype for first 27 columns from float to int by using iloc:

df1.iloc[:,0:27]=df1.iloc[:,0:27].astype('int')

However, it's not working. I'm not getting any error, but dtype is not changing as well. It still remains float.

Now the strangest part:

If I first change dtype for only 1st column (like below):

df1.iloc[:,0]=df1.iloc[:,0].astype('int')

and then run the earlier line of code:

df1.iloc[:,0:27]=df1.iloc[:,0:27].astype('int')

It works as required. Any help to understand this and solution to same will be grateful.

Thanks!

Upvotes: 12

Views: 7045

Answers (2)

Tunahan A.
Tunahan A.

Reputation: 142

Just don't use iloc. You can just create a loop over the 27 columns and convert them into the data type that you want.

df.info()
my_columns = df.columns.to_list()[0:27]
for i in my_columns:
   df[i] = df[i].astype('int32')
df.info()

Upvotes: 1

Andy L.
Andy L.

Reputation: 25259

I guess it is a bug in 1.0.5. I tested on my 1.0.5. I have the same issue as yours. The .loc also has the same issue, so I guess pandas devs break something in iloc/loc. You need to update to latest pandas or use a workaround. If you need a workaround, using assignment as follows

df1[df1.columns[0:27]] = df1.iloc[:, 0:27].astype('int')

I tested it. Above way overcomes this bug. It will turn first 27 columns to dtype int32

Upvotes: 8

Related Questions