Pandas read_csv在以0开头时改变列

时间:2016-10-25 15:39:39

标签: 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

然后我运行一个脚本:

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)

但是,只要有一个以0开头的邮政编码,我得到的结果是4位数,它不能与实际的0匹配。 我已经格式化了我的csv以在其中包含文本列,但它仍然无法正常工作。

我得到的邮政编码是这样的:

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

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

1 个答案:

答案 0 :(得分:5)

您需要将dtype作为str传递:

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

将这些值读作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

默认情况下,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