强制Pandas读入列作为原始unicode

时间:2017-08-09 19:57:07

标签: python python-2.7 pandas date unicode

我需要考虑将数据输入电子表格的人完全错误。我无法控制他们的行为,因为我正在从其他网站上抓取它。然而,有一些真正糟糕的数据输入,例如以下的" Tons"货物:

enter image description here

可爱,对吗?我需要找出一种方法来将像这样的数字读入大熊猫而不会将大熊猫自动转换为日期,之后就不可能将它们转换回11955和11862.要在顶部添加樱桃,以下不会工作:

dfx = pd.read_excel(ii,header=None,dtype={'Tons': str})

因为数据通常没有列标题,而且我从数据的顺序推断标题,幸运的是,这并没有改变。那么如何让熊猫在这里得到满意呢?

一旦我读入数据,即使我将整个列更改为unicode或字符串,它也只是日期的unicode或字符串表示形式:

 2055-01-19 00:00:00
 2062-01-18 00:00:00

所以我需要在" raw" (不知道这意味着什么)作为1,19,55没有大熊猫试图猜测类型,或者只是某种方式忽略了逗号...

谢谢!

1 个答案:

答案 0 :(得分:2)

您可以为converter列创建Tons,以根据需要格式化数据,pd.read_execel documentation说明:

  

转换器:dict,default无转换函数的字典   某些列中的值。键可以是整数或列   标签,值是带有一个输入参数的函数,即Excel   单元格内容,并返回转换后的内容。

例如,您可以使用以下转换器

tons_converter = lambda x: int("".join(x.split(',')))
dfx = pd.read_excel(ii,header=None,dtype={0: str}, converters={0: tons_converter})

可重复的例子

这是一个动态创建csv文件并应用转换的示例。

from StringIO import StringIO
import pandas as pd 

data = """
1,125,125
10,578,589
12
"""

tons_converter = lambda x: int("".join(x.split(',')))
dfx = pd.read_csv(StringIO(data),header=None,dtype=object, sep="|", converters={0: tons_converter})

print(dfx.head())

你想要的输出:

          0
0   1125125
1  10578589
2        12