为啥熊猫在写入 csv 时会删除前导零?

Posted

技术标签:

【中文标题】为啥熊猫在写入 csv 时会删除前导零?【英文标题】:Why does pandas remove leading zero when writing to a csv?为什么熊猫在写入 csv 时会删除前导零? 【发布时间】:2019-12-17 16:06:04 【问题描述】:

我有一个数据框,其中有一个名为“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 文件中的前导零被删除

【问题讨论】:

熊猫会删除它吗?或者您是在 excel 中打开它并且 excel 将其解释为数字并删除前导零? 尝试将其写入 .txt 文件: combine_acs_merge.to_csv(testFile.txt, sep=',',mode ='a') 并查看零是否仍然存在。 Erfan 假设 excel 在您打开文件时删除零可能是正确的。 【参考方案1】:

举个例子:

以下是您的示例 DataFrame:

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

num 视为可以转换为str() 的int。

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

输出:

$ cat 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)

但是,如果您的专栏 CBG 已经 str 那么它应该是直截了当的..

>>> 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

【讨论】:

嗨,谢谢你的回答,我遵循与你在这里提到的相同的过程,我明确地将 col 类型转换为 str 但在我的情况下,问题是当我使用 python 3.8 在 Windows 上运行时它可以工作很好,但是当我使用 python 3.5.2 在 ubuntu 16 上运行时,它不会按预期工作,并且总是删除该列的前导零,除非我在该列值上附加一些字符串字符【参考方案2】:

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

【讨论】:

【参考方案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.

【讨论】:

以上是关于为啥熊猫在写入 csv 时会删除前导零?的主要内容,如果未能解决你的问题,请参考以下文章

熊猫 read_csv dtype 前导零

为啥熊猫转换后在csv文件的开头添加数字[重复]

如何使用 C# 删除前导零

如何从字母数字文本中删除前导零?

从CSV中删除前导空格会导致插入空行和删除行

如何在熊猫列后期操作中保持前导零?