Pandas:读取带有引号值的 csv,逗号作为小数分隔符,句点作为数字分组符号 [duplicate]

Pandas: Read csv with quoted values, comma as decimal separator, and period as digit grouping symbol [duplicate]

提问人:bweber 提问时间:2/26/2022 最后编辑:TheMasterbweber 更新时间:6/8/2022 访问量:5933

问:

更新:在最初发布问题时,我没有意识到在某些条目中用作数字分组符号。但是,这些信息对问题至关重要。这是原始问题:.

我目前正在尝试在 pandas 中导入一个格式不太完美的 csv 文件,因为包括数字在内的所有值都用引号括起来。格式如下所示:

Date;Type;Amount;Currency;Category;Person;Account;Counter Account;Group;Note
"19.02.17";"Expenses";"-36,37";"EUR";"Groceries";"";"Bank account";"";"";""

现在,我尝试使用以下命令导入它:

import pandas

dtypes = {"Type":"string", "Amount": "float"}
table = pandas.read_csv("data.csv", delimiter = ";", decimal = ",", parse_dates = ["Date"], dtype = dtypes, quoting = 3)

所以我基本上一直在试图告诉熊猫,小数分隔符是逗号,字段分隔符是分号,并且“Amount”列应该解析为浮点数。但是,尝试解析文件时,我仍然收到错误消息:

ValueError: could not convert string to float: '689,15'"

我认为引号和逗号小数分隔符的组合对熊猫来说有点太多了,尽管我认为我已经在技术上为它提供了它需要的所有信息。

该文件是从第三方程序导出的,所以不幸的是我对格式没有影响。有谁知道如何让熊猫吞下这个?

奖励问题:如果我在没有提供显式数据类型的情况下阅读此文件,我不会像预期的那样获得任何“字符串”类型的列,而是使用“对象”。为什么?

Python Pandas CSV 行情

评论

0赞 Cubix48 2/26/2022
这回答了你的问题吗?带双引号的 pandas 数据
0赞 bweber 2/27/2022
谢谢,但我想我更喜欢一个直接适用于熊猫的解决方案。我现在也找到了一个解决方案,使用函数的参数(见我自己的答案)。convertersread_csv

答:

0赞 bweber 2/27/2022 #1

更新:虽然这个答案仍然有效,但有一个更简单的解决方案。我最初没有意识到某些条目用作数字分组符号,因此造成了混淆。.

好的,我找到了一种使用参数传递进行转换的 lambda 的方法。到目前为止,我还没有找到更简单的解决方案。converters

toFloat = lambda x: float(x.replace(".", "").replace(",", "."))
table = pandas.read_csv("data.csv", delimiter = ";", decimal = ",", parse_dates = ["Date"], converters = {"Amount": toFloat})

lambda 接受一个字符串,删除所有出现的字符(用作数字分组符号),替换所有出现的 by,然后将生成的字符串转换为浮点数。然后,此 lambda 作为列“Amount”的转换器传递给函数。可能现在这个论点也是消耗性的。toFloat.,.read_csvdecimal

我现在把这个问题搁置起来,看看是否有人能想出一个更简单的解决方案。

4赞 Cubix48 2/27/2022 #2

那又如何呢?

import pandas

table = pandas.read_csv("data.csv", sep=";", decimal=",")

print(table["Amount"][0])  # -36.37
print(type(table["Amount"][0]))   # <class 'numpy.float64'>
print(table["Amount"][0] + 36.37)  # 0.0

Pandas 会自动检测一个数字并将其转换为 。numpy.float64


编辑:

@bweber发现,某些值包含超过 3 位数字,并使用了数字分组符号 ''。为了将 String 转换为 Integer,必须将使用的符号传递给 read_csv() 方法:data.csv.

table = pandas.read_csv("data.csv", sep=";", decimal=",", thousands='.')

评论

0赞 bweber 2/27/2022
好的,谢谢!你帮我找到了真正的问题。我想我的问题中的信息是不够的。因为如果我只是用我在那里发布的示例行来尝试它,它实际上适用于您的代码。但是一旦我尝试使用整个 csv 文件,它就不再起作用了。这让我很困惑。所以,我做了一些调查,结果发现实际问题似乎是有些条目超过三位数,而这些条目使用数字分组符号('.')。这就是导致解析问题的真正原因。
0赞 bweber 2/27/2022
弄清楚了这一点,传球就解决了问题。我会相应地更新我的问题。如果您可以在答案中包含这些信息,我很乐意将其作为可接受的答案。thousands = '.'read_csv
1赞 Cubix48 2/27/2022
我更新了我的答案。很高兴我能帮助找到真正的问题!
1赞 bweber 2/27/2022
谢谢!我想如果熊猫错误消息会更好,我会更早到达那里,但它抱怨的值甚至没有使用分组符号。