在read_excel上使用pandas更改数据类型

时间:2015-04-01 18:28:34

标签: python pandas types

我正在寻找一些帮助,因为我实际上对pandas(和python)很新。 我正面临着一些数据的数据类型转换问题。

正如你所看到的(并尝试),我试图告诉大熊猫我希望它以字符串形式读取“DEP”数据列(因为我想保持数据不变)

>>> df = pd.read_excel("http://www2.impots.gouv.fr/documentation/statistiques/ircom2003/dep/060.xls", 0, skiprows=23, na_values="n.d.")
>>> df.dtypes
Unnamed: 0                                                  float64
DEP                                                         float64
Commune                                                     float64
...

>>> df["DEP"] = df["DEP"].astype(str)

>>> df.dtypes
Unnamed: 0                                                  float64
DEP                                                          object
Commune                                                     float64
.....

>>> df["DEP"][5]
'60.0'

如果需要,可以下载excel文件,但输入数据如下所示:(我在列名之间添加了斜杠)

DEP / Commune   / Libellé de la commune
060 001 AIGLUN
060 002 AMIRAT

在这种情况下,我想简单地将数据“060”和“001”保存为字符串。 我正在使用python 3.4和pandas 0.16

非常感谢你的帮助。

2 个答案:

答案 0 :(得分:1)

还有另一种可能性。我必须承认它有点scrapy,但我测试成功。

您需要创建一个新类:

class NewType():
   def __init__(self, sValue=""):
        self.strValue = sValue

   def __str__(self):
        return self.strValue

然后定义转换函数:

def convert(value):
    return NewType(value)

在您的函数中(您想要read_excel),请执行以下操作,假设您有28列要阅读:

import pandas as pd
converters = dict()
for i  in range(0,28,1):
    converters[i] = convert
dataframe = pd.read_excel(path_to_file, sheet_name, 0, None, 0, None, 27, False, None, "", None, False, None, converters)
dataframe = dataframe.transpose()
dataDict = dataframe.to_dict() 
newDict= OrderedDict()
for dataLine in dataDict.values():
    for field in dataLine.keys():
        dataLine[field] = str(dataLine[field])
    #do something with dataLine

如果您使用CSV

格式化数据,最后您将获得与CSV.DictReader相同的内容

答案 1 :(得分:0)

您可以使用格式转换为字符串:

df["DEPS"]=df["DEPS"].map(lambda x:'{0:03d}'.format(int(x)))

转换为int以删除小数位并将int转换为3位数的字符串。

编辑:只是详细说明,excel将数字存储为浮点数,而不是像csv文件中那样存储字符串。阅读.csv文件时,您可以指定列" dtype" s