为啥熊猫在写入 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 时会删除前导零?的主要内容,如果未能解决你的问题,请参考以下文章