csv 将逗号小数分隔符转换为Dataframe中的点

ovfsdjhp  于 2023-09-27  发布在  其他
关注(0)|答案(5)|浏览(129)

我正在使用pandas.read_csv导入如下所示的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能够做到这一点,而不需要手动操作。你有什么建议吗?

ef1yzkbh

ef1yzkbh1#

pandas.read_csv有一个decimal参数。
即尝试:

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

yduiuuwa2#

我认为前面提到的在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的版本要求字符串是精确匹配或正则表达式。

ifmq2ha2

ifmq2ha23#

斯塔拉西亚的回答似乎是最好的。
但是,如果你想在已经有一个dataframe的情况下更改分隔符,你可以这样做:

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

i86rm4rw4#

谢谢你的精彩回答。我只想补充一点,在我的例子中,仅仅使用decimal=','并不起作用,因为我有像1.450,00这样的数字(带有千位分隔符),因此pandas无法识别它,但传递thousands='.'有助于正确读取文件:

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

igetnqfo5#

我回答了关于如何使用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

你可以看到分隔符变成了点。

相关问题