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

Pyt*_*ous 47 python dataframe pandas

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

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

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

有没有办法在导入列时指定数据类型?我知道这在导入CSV文件时是可能的,但在语法中找不到任何内容read_excel().

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

tnk*_*epp 87

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

names   ages
bob     05
tom     4
suzy    3
Run Code Online (Sandbox Code Playgroud)

"年龄"列的格式为字符串.载入:

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
Run Code Online (Sandbox Code Playgroud)

  • 在哪里可以找到允许的转换器功能列表?我在这里看到了 `str`,但大概还有 `int` 和其他一些 - 是否有指向源文档的链接,列举了可用的可能转换器功能? (4认同)

Nic*_*eli 25

从函数开始v0.20.0,可以使用函数中的dtype关键字参数read_excel()来指定需要应用于列的数据类型,就像它存在的 read_csv()情况一样.

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


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

pd.read_excel('file_name.xlsx', dtype=str)            # (or) dtype=object
Run Code Online (Sandbox Code Playgroud)

2)它甚至支持一个字典映射,其中keys构成列名称和values它的相应数据类型,特别是当你想要改变dtype所有列的子集时.

# Assuming data types for `a` and `b` columns to be altered
pd.read_excel('file_name.xlsx', dtype={'a': np.float64, 'b': np.int32})
Run Code Online (Sandbox Code Playgroud)

  • `read_excel`方法接受`dtype`参数. (5认同)
  • 这应该是公认的答案,因为“转换器”似乎在将数据读取为不同类型后转换数据。这会导致信息丢失(“001”将被读取为 int("001")="1" 然后转换为 str。但是 "001" != "1") 。至少这就是我的情况,如果我错了,请纠正我。 (2认同)
  • 是的,这对我来说是更直观的解决方案 (2认同)

小智 12

如果您能够正确读取 Excel 文件,但只有整数值未显示。你可以这样指定。

df = pd.read_excel('my.xlsx',sheetname='Sheet1', engine="openpyxl", dtype=str)
Run Code Online (Sandbox Code Playgroud)

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


Nix*_*G-D 8

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

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

示例代码:

pandas.read_excel(my_file, converters = {my_str_column: str})
Run Code Online (Sandbox Code Playgroud)

  • 得到了解决方案:`converters = {col:str for col in column_list} df = pd.read_excel('some_excelfile.xls',converter = converters)` (6认同)

Tan*_*ngo 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)
Run Code Online (Sandbox Code Playgroud)

其中column_list是列名列表.

  • 只是想知道 `df = df.astype(str)` 会不会更好(更简单)。 (2认同)
  • 为什么要先创建一个列表?也许使用起来更有效: `conv = {x:str for x in pd.read_excel(fn,sheet_name='sheet1').columns}` 然后 `df = pd.read_excel(fn,sheet_name='sheet1',converters =转换)` (2认同)

Haz*_*a3d 5

如果您不知道列名并且想要为所有列指定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)
Run Code Online (Sandbox Code Playgroud)