为什么 pandas 在写入 csv 时会删除前导零?

Why does pandas remove leading zero when writing to a csv?

提问人:gwydion93 提问时间:8/10/2019 最后编辑:Deduplicatorgwydion93 更新时间:7/24/2020 访问量:14629

问:

我有一个数据帧,其中有一个名为“CBG”的列,其中数字作为字符串值。

    CBG             acs_total_persons   acs_total_housing_units
0   010010211001    1925                1013
1   010030114011    2668                1303
2   010070100043    930                 532    

当我将其写入 csv 文件时,前导“O”被删除:

combine_acs_merge.to_csv(new_out_csv, sep=',')
>>> CBG: [0: 10010221101, ...]

它已经是一个字符串;如何防止在文件中删除前导零.csv

python-3.x 字符串 pandas csv

评论

4赞 Erfan 8/10/2019
熊猫会移除它吗?或者你是在excel中打开它,excel是否将其解释为一个数字并删除前导零?
2赞 Tim Gottgetreu 8/10/2019
尝试将其写入.txt文件:combine_acs_merge.to_csv(testFile.txt, sep=',',mode ='a'),看看零是否仍然存在。Erfan 假设 excel 在您打开文件时删除零可能是正确的。

答:

8赞 manwithfewneeds 8/10/2019 #1

Pandas 不会剥离填充的零。您喜欢在Excel中打开时看到此内容。在 notepad++ 等文本编辑器中打开 csv,您会看到它们仍然是零填充的。

评论

0赞 phirschybar 3/9/2023
我认为这是不正确的。我看到前导零被剥离,除非我按照其他人的建议使用。dtype=str
9赞 Karn Kumar 8/10/2019 #2

让我们举个例子:

下面是您的示例 DataFrame:

>>> df
    col1   num
0    One   011
1    two  0123
2  three  0122
3   four  0333

将 视为可以转换为的 int。numstr()

>>> df["num"] = df["num"].astype(str)
>>> df.to_csv("datasheet.csv")

输出:

$ 猫datasheet.csv

你会发现前导零是完整的。

,col1,num
0,One,011
1,two,0123
2,three,0122
3,four,0333

或者,如果您先从 csv 读取数据,则使用 belwo..

pd.read_csv('test.csv', dtype=str)

但是,如果您的专栏已经存在,那么它应该是直截了当的。CBGstr

>>> df = pd.DataFrame({'CBG': ["010010211001", "010030114011", "010070100043"],
...                    'acs_total_persons': [1925, 2668, 930],
...                    'acs_total_housing_units': [1013, 1303, 532]})
>>>
>>> df
            CBG  acs_total_housing_units  acs_total_persons
0  010010211001                     1013               1925
1  010030114011                     1303               2668
2  010070100043                      532                930
>>> df.to_csv("CBG.csv")

结果:

$ cat CBG.csv
,CBG,acs_total_housing_units,acs_total_persons
0,010010211001,1013,1925
1,010030114011,1303,2668
2,010070100043,532,930

评论

0赞 Wasif Tanveer 3/24/2021
嗨,感谢您的回答,我正在遵循与您在此处提到的相同的过程,我将 col 类型明确转换为 str,但就我而言,问题是当我使用 python 3.8 在 Windows 上运行时,它工作正常,但是当我使用 python 16 在 ubuntu 3.5.2 上运行时,它无法按预期工作,并且总是删除该列的前导零, 除非我在该列值中附加一些字符串字符
4赞 katsu 7/24/2020 #3

读取 CSV 文件时,pandas 会尝试将每列中的值转换为它认为合适的数据类型。如果它看到一个仅包含数字的列,它会将此列的 dtype 设置为 int64。这会将“010010211001”转换为10010211001。

如果不希望发生任何数据类型转换,请在读取 CSV 文件时指定 dtype=str。 根据 read_csv https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html 的 pandas 文档:

dtype : Type name or dict of column -> type, optional

    Data type for data or columns. E.g. {‘a’: np.float64, ‘b’: np.int32, ‘c’: ‘Int64’} Use str or object
    together with suitable na_values settings to preserve and not interpret dtype. If
    converters are specified, they will be applied INSTEAD of dtype conversion.