我正在导入一个类似下面的csv文件。使用pandas.read_csv
df = pd.read_csv(Input, delimiter=";")
。 。
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能够在不需要手动操作的情况下执行此操作。你有什么建议吗?
答案 0 :(得分:45)
答案 1 :(得分:8)
我认为前面提到的在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的版本要求字符串是完全匹配或正则表达式。
答案 2 :(得分:2)
stallasia 的答案看起来是最好的。
但是,如果您想在已有数据框时更改分隔符,您可以这样做:
df['a'] = df['a'].str.replace(',', '.').astype(float)
答案 3 :(得分:1)
我回答有关如何使用Python Pandas将小数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
其中我们将小数点分隔符中的读数指定为逗号,而输出分隔符指定为点。所以
router.navigate
您看到分隔符已更改为点。