2015-10-15 1 views
1

J'utilise Pandas pour charger une feuille de calcul Excel qui contient du code postal (par exemple 32771). Les codes postaux sont stockés sous forme de chaînes à 5 chiffres dans une feuille de calcul. Quand ils sont tirés dans un DataFrame en utilisant la commande ...Python - Chargement de codes zip dans un DataFrame en tant que chaînes?

xls = pd.ExcelFile("5-Digit-Zip-Codes.xlsx") 
dfz = xls.parse('Zip Codes') 

ils sont convertis en nombres. Donc, '00501' devient 501.

Mes questions sont, comment puis-je:

a. Chargez le DataFrame et conservez le type de chaîne des codes postaux stockés dans le fichier Excel?

b. Convertissez les nombres dans le DataFrame en une chaîne à cinq chiffres, par ex. "501" devient "00501"?

Répondre

2
str(my_zip).zfill(5) 

ou

print("{0:>05s}".format(str(my_zip))) 

sont 2 de très nombreuses façons de le faire

2

Vous pouvez éviter l'inférence de type de panda avec un convertisseur de mesure, par exemple si 'zipcode' était l'en-tête de la colonne avec zipcodes:

dfz = xls.parse('Zip Codes', converters={'zipcode': lambda x:x}) 

Ceci est sans doute un bug depuis la colonne a été chaîne encodée, fait un problème here

+0

si vous avez '00501' dans Excel, numérique avec 2 zéros à gauche, qui donneraient' 501' en pandas géants .... –

+0

Cela fonctionne à merveille - merci! –

3

Pour contourner ce problème, vous pouvez convertir les int s à 0 rembourrées des chaînes de longueur 5 à l'aide Series.str.zfill:

df['zipcode'] = df['zipcode'].astype(str).str.zfill(5) 

Demo:

import pandas as pd 
df = pd.DataFrame({'zipcode':['00501']}) 
df.to_excel('/tmp/out.xlsx') 
xl = pd.ExcelFile('/tmp/out.xlsx') 
df = xl.parse('Sheet1') 
df['zipcode'] = df['zipcode'].astype(str).str.zfill(5) 
print(df) 

rendements

zipcode 
0 00501