我正在导入来自其他办公室的excel文件的数据。 在其中一列中,对于每个单元格,我都有用作标记的数字列表。这些是由不同的人手动插入的(我的猜测)使用具有不同数千设置的计算机,因此结果非常不同。
作为一个例子,我有:
tags= ['205', '306.3', '3,206,302','7.205.206']
如果这是一个CSV文件(我尝试转换一个文件进行检查),请使用
pd.read_csv(my_file,sep=';')
会给我一个上面提到的清单。
不幸的是,正如所说,我们正在谈论excel文件(复数),我必须处理它,并使用
pd.read_excel(my_file,sheetname=my_sheet,encoding='utf-16',converters{'my_column':str})
我得到的是:
tags= ['205', '306.3', '3,206,302','7205206']
如您所见,只要数字逻辑成千上万(因此,不是我列表中的第二个数字),该点就会被识别为千位分隔符,而我会得到一个数字,而不是三个。
我尝试阅读文档,并在stackoverflow和google上搜索,但用于描述此问题的关键字过于模糊,但我找不到可行的解决方案。
如何使用excel文件获取正确的列表?
感谢。
答案 0 :(得分:3)
可能会发生此问题,因为pandas is running their number parser before their date parser。
一种可能的解决方法是添加千位分隔符。例如,如果您实际上正在使用','作为千位分隔符,您可以在Excel阅读器中添加thousands=','
:
pd.read_excel(my_file,sheetname=my_sheet,encoding='utf-16',thousands=',',converters{'my_column':str})
您还可以选择数据中不存在的任意千位分隔符,以便在thousands=None
(which should be the default according to documentation)之前保持输出保持不变,并且还没有处理过你的问题。您还应该确保将字段转换为str(在这种情况下,使用千位是多余的,因为它不适用于任何方式)。
编辑:
我尝试使用以下虚拟数据(' test.xlsx'):
a b c d
205 306.3 3,206,302 7.205.206
和
dataf = pandas.read_excel('test.xlsx', header=0, converters={'a':str, 'b':str,'c':str,'d':str})
print(dataf.to_string)
我得到了以下输出:
Columns: [205, 306.3, 3,206,302, 7.205.206]
这正是您所寻找的。您确定自己拥有最新版本的pandas,并且您实际上未在转换器关键字中使用converters = {'col':int}
或float
吗?
就目前而言,听起来您要么将字段转换为数字(int或float),要么代码中的其他地方存在问题。 pandas read_excel
似乎按照描述工作,我可以使用上面指定的代码获得您指定的结果。在其他方面:您的代码应该可以工作,如果它不是由于过时的pandas版本,代码中的其他部分甚至是源数据的问题。目前,您无法使用您提供的信息进一步回答您的问题。