将逗号小数点分隔符转换为 Dataframe 中的点
Convert commas decimal separators to dots within a Dataframe
我正在使用 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 无需执行此操作即可执行此操作它手动。你有什么建议吗?
pandas.read_csv
有一个 decimal
参数:doc
即尝试:
df = pd.read_csv(Input, delimiter=";", decimal=",")
我认为前面提到的将 decimal=","
包含在 pandas read_csv 中的答案是首选。
但是,我发现它与 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 的 built-in 版本。 Pandas' 版本要求字符串是完全匹配或正则表达式。
我回答了关于如何将小数 comma
更改为小数 dot
的问题 Python Pandas。
$ 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
您看到分隔符已更改为点。
stallasia 的回答看起来是最好的。
但是,如果您想在已有数据框时更改分隔符,您可以这样做:
df['a'] = df['a'].str.replace(',', '.').astype(float)
感谢您的精彩回答。我只想补充一点,在我的情况下,仅使用 decimal=','
不起作用,因为我有像 1.450,00 这样的数字(带有千位分隔符),因此 pandas 无法识别它,但传递 thousands='.'
帮助正确读取文件:
df = pd.read_csv(
Input,
delimiter=";",
decimal=","
thousands="."
)
我正在使用 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 无需执行此操作即可执行此操作它手动。你有什么建议吗?
pandas.read_csv
有一个 decimal
参数:doc
即尝试:
df = pd.read_csv(Input, delimiter=";", decimal=",")
我认为前面提到的将 decimal=","
包含在 pandas read_csv 中的答案是首选。
但是,我发现它与 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 的 built-in 版本。 Pandas' 版本要求字符串是完全匹配或正则表达式。
我回答了关于如何将小数 comma
更改为小数 dot
的问题 Python Pandas。
$ 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
您看到分隔符已更改为点。
stallasia 的回答看起来是最好的。
但是,如果您想在已有数据框时更改分隔符,您可以这样做:
df['a'] = df['a'].str.replace(',', '.').astype(float)
感谢您的精彩回答。我只想补充一点,在我的情况下,仅使用 decimal=','
不起作用,因为我有像 1.450,00 这样的数字(带有千位分隔符),因此 pandas 无法识别它,但传递 thousands='.'
帮助正确读取文件:
df = pd.read_csv(
Input,
delimiter=";",
decimal=","
thousands="."
)