Python pandas:如何在读取Excel文件时指定数据类型?

时间:2015-09-15 16:48:10

标签: python pandas dataframe

我正在使用pandas.read_excel()函数将excel文件导入到pandas数据框中。

其中一列是表格的主键:它是所有数字,但它以文本形式存储(Excel单元格左上角的绿色小三角确认了这一点)。

但是,当我将文件导入pandas数据帧时,该列将作为float导入。这意味着,例如,'0614'变为614。

导入列时是否有指定数据类型的方法?我知道在导入CSV文件时可能会出现这种情况,但在read_excel()的语法中找不到任何内容。

我能想到的唯一解决方案是在Excel的文本开头添加一个任意字母(将'0614'转换为'A0614'),以确保将列导入为文本,然后切断python中的'A',所以我可以将它与我从SQL导入的其他表匹配。

7 个答案:

答案 0 :(得分:70)

您只需指定转换器即可。我创建了一个以下结构的Excel电子表格:

names   ages
bob     05
tom     4
suzy    3

“年龄”列的格式为字符串。加载:

import pandas as pd

df = pd.read_excel('Book1.xlsx',sheetname='Sheet1',header=0,converters={'names':str,'ages':str})
>>> df
       names ages
   0   bob   05
   1   tom   4
   2   suzy  3

答案 1 :(得分:17)

v0.20.0开始,read_excel()函数中的dtype关键字参数可用于指定需要应用于列的数据类型,就像它存在于{{3案件。

在同一列名称上同时使用convertersdtype个参数会导致后者被遮蔽而前者会获得优先权。

1)为了使它不解释dtypes而是传递它之前在文件中的所有内容,我们可以将此arg设置为str或{{1所以我们不会弄乱我们的数据。 (一个这样的情况将是数字中的前导零,否则会丢失)

object

2)它甚至支持一个dict映射,其中pd.read_excel('file_name.xlsx', dtype=str) # (or) dtype=object 构成列名,keys它是各自要设置的数据类型,尤其是当您想要更改子集的values时所有栏目。

dtype

答案 2 :(得分:8)

read_excel()函数有一个converter参数,您可以在其中应用函数以在某些列中输入。您可以使用它将它们保存为字符串。 Documentation

  

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

示例代码:

pandas.read_excel(my_file, converters = {my_str_column: str})

答案 3 :(得分:5)

如果你不知道数据帧中列的数量和名称,那么这个方法可以很方便:

column_list = []
df_column = pd.read_excel(file_name, 'Sheet1').columns
for i in df_column:
    column_list.append(i)
converter = {col: str for col in column_list} 
df_actual = pd.read_excel(file_name, converters=converter)

其中column_list是列名列表。

答案 4 :(得分:3)

如果您能够正确读取 excel 文件并且只有整数值没有显示。你可以这样指定。

df = pd.read_excel('my.xlsx',sheetname='Sheet1', engine="openpyxl", dtype=str)

这应该将您的整数值更改为字符串并显示在数据框中

答案 5 :(得分:1)

如果您不知道列名,并且想为所有列指定 str 数据类型:

table = pd.read_excel("path_to_filename")
cols = table.columns
conv = dict(zip(cols ,[str] * len(cols)))
table = pd.read_excel("path_to_filename", converters=conv)

答案 6 :(得分:0)

如果键的位数固定,则应该存储为文本而不是数字数据。您可以为此使用converters参数或read_excel

或者,如果这不起作用,则只要将数据读入数据框就可以对其进行操作:

df['key_zfill'] = df['key'].astype(str).str.zfill(4)

  names   key key_zfill
0   abc     5      0005
1   def  4962      4962
2   ghi   300      0300
3   jkl    14      0014
4   mno    20      0020