¿Cómo cambio el tipo de datos del dataframe de pandas a una cadena con un formato definido?

Estoy empezando a arrancarme el pelo con esto, así que espero que alguien pueda ayudar. Tengo un dataframe de pandas que se creó a partir de una hoja de cálculo de Excel con openpyxl. El DataFrame resultante se ve así:

print image_name_data id image_name 0 1001 1001_mar2014_report 1 1002 1002_mar2014_report 2 1003 1003_mar2014_report [3 rows x 2 columns] 

… con los siguientes tipos de datos:

 print image_name_data.dtypes id float64 image_name object dtype: object 

El problema es que los números en la columna de identificación son, de hecho, números de identificación y necesito tratarlos como cadenas. He intentado convertir la columna de identificación en cadenas usando:

 image_name_data['id'] = image_name_data['id'].astype('str') 

Esto parece un poco feo, pero produce una variable de tipo ‘objeto’ en lugar de ‘float64’:

 print image_name_data.dyptes id object image_name object dtype: object 

Sin embargo, las cadenas que se crean tienen un punto decimal, como se muestra:

 print image_name_data id image_name 0 1001.0 1001_mar2014_report 1 1002.0 1002_mar2014_report 2 1003.0 1003_mar2014_report [3 rows x 2 columns] 

¿Cómo puedo convertir una columna float64 en un DataFrame de pandas a una cadena con un formato dado (en este caso, por ejemplo, ‘% 10.0f’)?

No puedo reproducir su problema, pero ¿ha intentado convertirlo primero en un entero?

 image_name_data['id'] = image_name_data['id'].astype(int).astype('str') 

Luego, con respecto a tu pregunta más general, puedes usar el map ( como en esta respuesta ). En tu caso:

 image_name_data['id'] = image_name_data['id'].map('{:.0f}'.format) 

Si pudiera recargar esto, podría usar el argumento dtypes.

 pd.read_csv(..., dtype={'COL_NAME':'str'}) 

Estoy poniendo esto en una nueva respuesta porque no hay linebreaks / codeblocks en los comentarios. ¿Supongo que quieres que esos nans se conviertan en una cadena en blanco? No pude encontrar una buena manera de hacer esto, solo hago el método feo:

 s = pd.Series([1001.,1002.,None]) a = s.loc[s.isnull()].fillna('') b = s.loc[s.notnull()].astype(int).astype(str) result = pd.concat([a,b])