将逗号转换为Dataframe中的点

Nau*_*ius 27 python pandas

我正在导入一个类似下面的csv文件.使用pandas.read_csv

df = pd.read_csv(Input, delimiter=";")
Run Code Online (Sandbox Code Playgroud)

...

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:不能将序列乘以'float'类型的非int.

我收到此错误是因为我尝试使用的数字不是用点(.)作为小数分隔符而是用逗号(,)写的.手动将逗号更改为点后我的程序工作.

我无法更改输入的格式,因此必须替换我的DataFrame中的逗号才能使我的代码正常工作,我希望python能够在不需要手动执行的情况下执行此操作.你有什么建议吗?

ste*_*sia 53

pandas.read_csv有一个decimal参数:doc

即尝试:

df = pd.read_csv(Input, delimiter=";", decimal=",")
Run Code Online (Sandbox Code Playgroud)


小智 16

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

但是,如果您想在已有数据框时更改分隔符,您可以执行以下操作:

df['a'] = df['a'].str.replace(',', '.').astype(float)
Run Code Online (Sandbox Code Playgroud)


Lo_*_*Lo_ 10

我认为前面提到的包含decimal=","在pandas read_csv 中的答案是首选方案.

但是,我发现它与Python解析引擎不兼容.例如,使用时skiprow=,read_csv将回落到这个引擎,因此不能使用skiprow=,并decimal=在同一read_csv语句,据我所知.此外,我还没能真正让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)
Run Code Online (Sandbox Code Playgroud)

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

请注意,.replace这里使用的不是pandas,而是Python的内置版本.Pandas的版本要求字符串是完全匹配或正则表达式.


Fel*_*lix 8

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

df = pd.read_csv(
    Input, 
    delimiter=";", 
    decimal=","
    thousands="."
)
Run Code Online (Sandbox Code Playgroud)


hhh*_*hhh 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='.')
Run Code Online (Sandbox Code Playgroud)

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

$ cat test.csv 
header,header2
1,"2,1"
3,"4,0"
$ cat test2.csv 
,header,header2
0,1,2.1
1,3,4.0
Run Code Online (Sandbox Code Playgroud)

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