如何使用Pandas导出CSV时保留数据前导零?
解决Pandas导出CSV时FIPS代码前导零丢失的问题
问题原因澄清
首先要明确:用to_csv()导出的CSV文件本身是保留了前导零的,你看到的丢失现象大概率是用Excel打开文件时,Excel自动将类似数字的字符串识别为数值类型,从而去掉了前导零。你可以用纯文本编辑器(如VS Code、记事本)打开导出的test.csv,就能看到前导零其实还在。
解决办法
根据你的需求,分两种场景给出方案:
1. 确保CSV文件本身保留前导零(纯文本层面)
你的现有代码其实已经实现了这一点,导出的CSV文本里FIPS列是带前导零的字符串。如果需要验证,直接用文本编辑器打开文件即可。
2. 让Excel打开时自动保留前导零
如果需要让用户用Excel打开时也能看到前导零,可以用以下几种方法:
方法一:给FIPS列添加单引号前缀
修改DataFrame的FIPS列,在每个值前加单引号,Excel会将其识别为文本:
import pandas as pd from io import StringIO input_csv = "index,FIPS\n \ 1,01001\n \ 2,02001 " df = pd.read_csv(StringIO(input_csv), dtype={'FIPS': str}) # 添加单引号前缀 df['FIPS'] = "'" + df['FIPS'] df.to_csv("test.csv", index=False)
方法二:使用引号包裹字符串
导入csv模块,设置quoting参数为csv.QUOTE_NONNUMERIC,让所有非数字字符串被引号包裹,Excel打开时会保留文本格式:
import pandas as pd from io import StringIO import csv input_csv = "index,FIPS\n \ 1,01001\n \ 2,02001 " df = pd.read_csv(StringIO(input_csv), dtype={'FIPS': str}) df.to_csv("test.csv", index=False, quoting=csv.QUOTE_NONNUMERIC)
方法三:直接导出为Excel文件并指定文本格式
如果可以导出为Excel格式(.xlsx),可以用to_excel()配合格式设置,确保FIPS列为文本类型:
import pandas as pd from io import StringIO input_csv = "index,FIPS\n \ 1,01001\n \ 2,02001 " df = pd.read_csv(StringIO(input_csv), dtype={'FIPS': str}) # 使用xlsxwriter引擎,设置列格式 with pd.ExcelWriter('test.xlsx', engine='xlsxwriter') as writer: df.to_excel(writer, index=False, sheet_name='Sheet1') workbook = writer.book worksheet = writer.sheets['Sheet1'] # 定义文本格式 text_format = workbook.add_format({'num_format': '@'}) # 设置FIPS列(第2列,索引从0开始是第1列)为文本格式 worksheet.set_column(1, 1, None, text_format)
内容的提问来源于stack exchange,提问作者Ravi Shankar
相关产品推荐
相关产品推荐

