2016-10-25 2 views
2

Ich habe ein Skript, wo ich aus einer CSV-Datei einige Postleitzahlen gelesen habe. Das Format der zipcodes wie diese sind:Pandas read_csv ändert die Spalten beim Start mit 0

zipcode 
75180 
90672 
01037 
20253 
09117 
31029 
07745 
90453 
12105 
18140 
36108 
10403 
76470 
06628 
93105 
88069 
31094 
84095 
63069 

Dann laufe ich ein Skript:

import requests 
import pandas as pd 
import time 

file = '/Users/zipcode.csv' 
reader = pd.read_csv(file, sep=';', encoding='utf-8-sig') 

zipcodes = reader["zipcode"].astype(str) 
base_url = "https://api.blabla/?zipcode={zipcode}" 
headers = {'Authentication': 'random'} 

for zipcode in zipcodes: 
    url = base_url.format(zipcode=zipcode) 
    r = requests.get(url, 
        headers=headers) 
    for r_info in r.json()["data"]: 
     print zipcode,r_info["id"] 
    time.sleep(0.5) 

Jedes Mal, wenn es eine zipcode mit 0 beginnt, ist das Ergebnis, das ich bekommen, ist mit 4 Ziffern und es kann nicht mit der tatsächlichen 0 übereinstimmen. Ich habe mein csv formatiert, um eine Textspalte darin zu haben, aber noch funktioniert es nicht.

Die zipcodes ich sind wie folgt aus:

zipcode 
75180 
90672 
1037 
20253 
9117 
31029 
7745 
90453 
12105 
18140 
36108 
10403 
76470 
6628 
93105 
88069 
31094 
84095 
63069 

Sie haben keine Ahnung, wie dieses Problem gelöst werden kann?

Antwort

5

Sie müssen die dtype als str weitergeben müssen:

reader = pd.read_csv(file, sep=';', encoding='utf-8-sig', dtype=str) 

lesen diese Werte als str:

In [152]: 
import pandas as pd 
import io 
t="""zipcode 
75180 
90672 
01037 
20253 
09117 
31029 
07745 
90453 
12105 
18140 
36108 
10403 
76470 
06628 
93105 
88069 
31094 
84095 
63069""" 
df = pd.read_csv(io.StringIO(t), dtype=str) 
df 

Out[152]: 
    zipcode 
0 75180 
1 90672 
2 01037 
3 20253 
4 09117 
5 31029 
6 07745 
7 90453 
8 12105 
9 18140 
10 36108 
11 10403 
12 76470 
13 06628 
14 93105 
15 88069 
16 31094 
17 84095 
18 63069 

von Standard Pandas schnüffelt die dytpes und in diesem Fall denkt, dass es sie numerisch sind so Sie verlieren führende Nullen

Sie können dies auch als Nachbearbeitungsschritt tun, indem Sie auf str werfen und dann unter Verwendung der vektorisierten str.zfill:

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

Out[154]: 
    zipcode 
0 75180 
1 90672 
2 01037 
3 20253 
4 09117 
5 31029 
6 07745 
7 90453 
8 12105 
9 18140 
10 36108 
11 10403 
12 76470 
13 06628 
14 93105 
15 88069 
16 31094 
17 84095 
18 63069 
+0

JA !! Vielen Dank: D –

Verwandte Themen