提问人:bweber 提问时间:2/26/2022 最后编辑:TheMasterbweber 更新时间:6/8/2022 访问量:5933
Pandas:读取带有引号值的 csv,逗号作为小数分隔符,句点作为数字分组符号 [duplicate]
Pandas: Read csv with quoted values, comma as decimal separator, and period as digit grouping symbol [duplicate]
问:
更新:在最初发布问题时,我没有意识到在某些条目中用作数字分组符号。但是,这些信息对问题至关重要。这是原始问题:.
我目前正在尝试在 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'"
我认为引号和逗号小数分隔符的组合对熊猫来说有点太多了,尽管我认为我已经在技术上为它提供了它需要的所有信息。
该文件是从第三方程序导出的,所以不幸的是我对格式没有影响。有谁知道如何让熊猫吞下这个?
奖励问题:如果我在没有提供显式数据类型的情况下阅读此文件,我不会像预期的那样获得任何“字符串”类型的列,而是使用“对象”。为什么?
答:
更新:虽然这个答案仍然有效,但有一个更简单的解决方案。我最初没有意识到某些条目用作数字分组符号,因此造成了混淆。.
好的,我找到了一种使用参数传递进行转换的 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_csv
decimal
我现在把这个问题搁置起来,看看是否有人能想出一个更简单的解决方案。
那又如何呢?
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='.')
评论
thousands = '.'
read_csv
评论
converters
read_csv