Convert Column Name from int to string in pandas

Question:

I have a pandas dataframe with mixed column names:

1,2,3,4,5, ‘Class’

When I save this dataframe to h5file, it says that the performance will be affected due to mixed types. How do I convert the integer to string in pandas?

Asked By: Dzung Nguyen

||

Answers:

You can simply use df.columns = df.columns.astype(str):

In [26]: df = pd.DataFrame(np.random.random((3,6)), columns=[1,2,3,4,5,'Class'])

In [27]: df
Out[27]: 
          1         2         3         4         5     Class
0  0.773423  0.865091  0.614956  0.219458  0.837748  0.862177
1  0.544805  0.535341  0.323215  0.929041  0.042705  0.759294
2  0.215638  0.251063  0.648350  0.353999  0.986773  0.483313

In [28]: df.columns.map(type)
Out[28]: 
array([<class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>,
       <class 'int'>, <class 'str'>], dtype=object)

In [29]: df.to_hdf("out.h5", "d1")
C:Anaconda3libsite-packagespandasiopytables.py:260: PerformanceWarning: 
your performance may suffer as PyTables will pickle object types that it cannot
map directly to c-types [inferred_type->mixed-integer,key->axis0] [items->None]

  f(store)
C:Anaconda3libsite-packagespandasiopytables.py:260: PerformanceWarning: 
your performance may suffer as PyTables will pickle object types that it cannot
map directly to c-types [inferred_type->mixed-integer,key->block0_items] [items->None]

  f(store)

In [30]: df.columns = df.columns.astype(str)

In [31]: df.columns.map(type)
Out[31]: 
array([<class 'str'>, <class 'str'>, <class 'str'>, <class 'str'>,
       <class 'str'>, <class 'str'>], dtype=object)

In [32]: df.to_hdf("out.h5", "d1")

In [33]:
Answered By: DSM

You can simply use df.columns = df.columns.map(str)

DSM’s first answer df.columns = df.columns.astype(str) didn’t work for my dataframe. (I got TypeError: Setting dtype to anything other than float64 or object is not supported)

Answered By: aerin

You can always rename all columns using numbers like this post says
[https://stackoverflow.com/a/44292845/11165920][1]
and then select numeric column labels like this:

   df[1]

instead of using usual string selection:

df.loc[:, '1']

And you won´t have mixed types either.
[1]: https://stackoverflow.com/a/44292845/11165920

Answered By: electric-lady
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.