gpt4 book ai didi

python - Pandas read_csv 处理给定数字数据类型的带引号字符串

转载 作者:行者123 更新时间:2023-12-05 03:30:00 25 4
gpt4 key购买 nike

我正在有效地尝试将以下文件读入 DataFrame 并再次将其原封不动地写出。

F1,F2,F3,F4,F5
"blah","blah",123,"123","123"
"blue","blue",456,"456",""

我原以为 pandas.read_csv 会将上面的所有字段解释为字符串(因此 dtype:object),F3 除外。

但是,F4 被视为数字字段并指定 dtype:int64
这意味着使用 quoting=csv.QUOTE_NONNUMERIC 再次写回数据会丢失 F4 周围的引号。

pd.read_csv(test, quotechar='"', sep=',')
Out[90]:
F1 F2 F3 F4 F5
0 blah blah 123 123 123.0
1 blue blue 456 456 NaN

pd.read_csv("test.txt", quotechar='"', sep=',').dtypes
Out[91]:
F1 object
F2 object
F3 int64
F4 int64
dtype: object

这还会产生另一个问题:如果任何 F5 值是空字符串(即 ""),F5 将被视为 float64 为空字符串的 NaN 值。这些值将被写回为 "",但所有实际值现在都将附加一个 .0,因为它们被视为 float 。

我尝试过 quoting 参数的各种选项 - quoting=csv.QUOTE_NONE 是唯一将 F4 和 F5 视为字符串的选项,但随后我显然以数据中嵌入的实际引号结束。我本以为 quoting=csv.QUOTE_NONNUMERIC 会做我想做的事,但它将所有 F3、F4、F5 都视为 float64

我觉得我可能在这里遗漏了一些关于如何确定数据类型的基本知识?我能想到的唯一解决方法是读取每个文件的标题和第一个数据行,将其解析为带引号的字段,并即时构建一个显式字典(或者首先使用 quoting=csv.QUOTE_NONE< 读取文件 并根据哪些列包含引号执行相同的操作)然后使用显式数据类型再次读取文件。

这似乎是一个冗长(而且很慢!)的替代方案,所以我希望有人能指出我在 read_csv 文档中遗漏的内容。谢谢。

额外的细节以防任何相关:

  • 我正在处理大量文件,每个文件都有大量(且不同的)列集,因此我无法为每个文件指定显式数据类型。
  • 要被视为文本的数据用双引号引起来,其余数据是数字。
  • 显然,我不会让数据完全不变,但除了我正在添加/修改的列之外,其他列应该不受影响。
  • 文件大部分是格式正确的 CSV,分隔符之间没有多余的空格
  • 大多数都有一些额外的标题行,当我调用 read_csv 时,我首先解析这些标题行并使用 header=nnn 跳过。

最佳答案

很遗憾,您想要实现的目标是不可能的。

CSV 引号定义字段,而不是内容类型

当解析器看到“123”、“12,3”或“ab,c”时,它使用引号将逗号保留为字段的一部分,而不是定义内容是数字还是其他任何内容。那么引用不是内容的一部分。

正如@user2357112supportsMonica 很好地指出的那样,这对于处理欧洲小数点分隔符很重要。

因此,回到您的问题,“123”和 123 在内容方面完全相同,您无法从中提取类型信息……

关于python - Pandas read_csv 处理给定数字数据类型的带引号字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70924234/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com