将逗号小数分隔符转换为数据框中的点

问题描述 投票:0回答:5

我正在导入如下所示的 CSV 文件,使用

pandas.read_csv
:

df = pd.read_csv(Input, delimiter=";")

CSV 文件示例:

10;01.02.2015 16:58;01.02.2015 16:58;-0.59;0.1;-4.39;NotApplicable;0.79;0.2
11;01.02.2015 16:58;01.02.2015 16:58;-0.57;0.2;-2.87;NotApplicable;0.79;0.21

问题是,当我稍后在代码中尝试使用这些值时,我收到此错误:

TypeError: can't multiply sequence by non-int of type 'float'

错误是因为我尝试使用的数字不是用点(

.
)作为小数分隔符,而是用逗号(
,
书写。手动将逗号更改为点后,我的程序可以运行。

我无法更改输入的格式,因此必须替换 DataFrame 中的逗号才能使我的代码正常工作,并且我希望 python 无需手动执行此操作即可完成此操作。你有什么建议吗?

python pandas csv delimiter separator
5个回答
158
投票

pandas.read_csv
有一个
decimal
参数。

即尝试:

df = pd.read_csv(Input, delimiter=";", decimal=",")

26
投票

我认为前面提到的在 pandas read_csv 中包含

decimal=","
的答案是首选选项。

但是,我发现它与Python解析引擎不兼容。例如当使用

skiprow=
时,read_csv 将回退到该引擎,因此据我所知,您不能在同一个 read_csv 语句中使用
skiprow=
decimal=
。另外,我还没有能够真正让
decimal=
语句发挥作用(可能是因为我)

我用来实现相同结果的漫长方法是使用列表理解,

.replace
.astype
。此方法的主要缺点是需要一次完成一列:

df = pd.DataFrame({'a': ['120,00', '42,00', '18,00', '23,00'], 
                'b': ['51,23', '18,45', '28,90', '133,00']})

df['a'] = [x.replace(',', '.') for x in df['a']]

df['a'] = df['a'].astype(float)

现在,a 列将具有浮动类型单元格。 b 列仍然包含字符串。

注意,这里使用的

.replace
不是pandas,而是Python的内置版本。 Pandas 的版本要求字符串完全匹配或正则表达式。


16
投票

stallasia 的答案看起来是最好的。

但是,如果您想在已有数据框时更改分隔符,您可以这样做:

df['a'] = df['a'].str.replace(',', '.').astype(float)

8
投票

感谢您的精彩回答。我只想补充一点,在我的情况下,仅使用

decimal=','
不起作用,因为我有像 1.450,00 这样的数字(带有千位分隔符),因此 pandas 无法识别它,但传递
thousands='.'
有助于正确读取文件:

df = pd.read_csv(
    Input, 
    delimiter=";", 
    decimal=","
    thousands="."
)

5
投票

我回答了关于如何使用Python Pandas将小数

comma
更改为小数
dot
的问题。

$ cat test.py 
import pandas as pd
df = pd.read_csv("test.csv", quotechar='"', decimal=",")
df.to_csv("test2.csv", sep=',', encoding='utf-8', quotechar='"', decimal='.')

我们将小数分隔符中的读数指定为逗号,而输出分隔符指定为点。所以

$ cat test.csv 
header,header2
1,"2,1"
3,"4,0"
$ cat test2.csv 
,header,header2
0,1,2.1
1,3,4.0

您看到分隔符已更改为点。

© www.soinside.com 2019 - 2024. All rights reserved.