web-dev-qa-db-fra.com

Comment changer le type de données de pandas trame de données en chaîne avec un format défini?)

Je commence à m'arracher les cheveux avec ça - j'espère donc que quelqu'un pourra vous aider. J'ai un pandas DataFrame qui a été créé à partir d'une feuille de calcul Excel en utilisant openpyxl. Le DataFrame résultant ressemble à ceci:

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]

… Avec les types de données suivants:

print image_name_data.dtypes
id            float64
image_name     object
dtype: object

Le problème est que les numéros dans la colonne id sont, en fait, des numéros d'identification et que je dois les traiter comme des chaînes. J'ai essayé de convertir la colonne id en chaînes en utilisant:

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

Cela semble un peu moche mais cela produit une variable de type 'objet' plutôt que 'float64':

print image_name_data.dyptes
id            object
image_name    object
dtype: object

Cependant, les chaînes créées ont un point décimal, comme indiqué:

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]

Comment puis-je convertir une colonne float64 dans un pandas DataFrame en chaîne avec un format donné (dans ce cas, par exemple, '% 10.0f')?

22
user1718097

Je ne parviens pas à reproduire votre problème, mais avez-vous d'abord essayé de le convertir en entier?

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

Ensuite, concernant votre question plus générale, vous pouvez utiliser map ( comme dans cette réponse ). Dans ton cas:

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

Si vous pouviez recharger cela, vous pourriez utiliser l'argument dtypes.

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

Je mets cela dans une nouvelle réponse car il n'y a pas de sauts de ligne/codeblocks dans les commentaires. Je suppose que vous voulez que ces nans se transforment en une chaîne vide? Je ne pouvais pas trouver un moyen gentil de faire ceci, fais seulement la méthode laide:

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])
2
exp1orer