如何正确解析使用Python在excel文件中用混合逗号和点分隔的文本数字?

时间:2016-11-24 11:27:11

标签: python excel pandas

我正在导入来自其他办公室的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文件获取正确的列表?

感谢。

1 个答案:

答案 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=Nonewhich 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版本,代码中的其他部分甚至是源数据的问题。目前,您无法使用您提供的信息进一步回答您的问题。