Pandas read_csv在以0开头时改变列

Nas*_*lla 2 python pandas

我有一个脚本,我从csv文件中读取一些zipcodes.zipcodes的格式如下:

zipcode
75180
90672
01037
20253
09117
31029
07745
90453
12105
18140
36108
10403
76470
06628
93105
88069
31094
84095
63069
Run Code Online (Sandbox Code Playgroud)

然后我运行一个脚本:

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)
Run Code Online (Sandbox Code Playgroud)

但是,每当有一个以0开头的邮政编码时,我得到的结果是4位数,它与实际的0不匹配.我已经格式化了我的csv,其中有一个文本列,但它仍然不起作用.

我得到的zipcodes是这样的:

zipcode
75180
90672
1037
20253
9117
31029
7745
90453
12105
18140
36108
10403
76470
6628
93105
88069
31094
84095
63069
Run Code Online (Sandbox Code Playgroud)

你知道如何解决这个问题吗?

EdC*_*ica 5

你需要传递dtypeas str:

reader = pd.read_csv(file, sep=';', encoding='utf-8-sig', dtype=str)
Run Code Online (Sandbox Code Playgroud)

将这些值读作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
Run Code Online (Sandbox Code Playgroud)

默认情况下,pandas嗅探dytpes并且在这种情况下它认为它们是数字的,所以你会丢失前导零

您也可以通过转换为str然后使用矢量化来执行此操作作为后处理步骤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
Run Code Online (Sandbox Code Playgroud)