使用Pandas-Python如何从Excel中读取特定列

68

我在读取Excel表格,并且想要读取某些列:第0列是行索引,以及第22到37列。这是我的做法:

import pandas as pd
import numpy as np
file_loc = "path.xlsx"
df = pd.read_excel(file_loc, index_col=None, na_values=['NA'], parse_cols = 37)
df= pd.concat([df[df.columns[0]], df[df.columns[22:]]], axis=1)

但我希望有更好的方法来做到这一点!我知道如果我使用 parse_cols=[0, 22,..,37] ,我可以做到,但对于大型数据集来说这并不明智。

我还尝试了这个方法:

s = pd.Series(0)
s[1]=22
for i in range(2,14):
    s[i]=s[i-1]+1
df = pd.read_excel(file_loc, index_col=None, na_values=['NA'], parse_cols = s)

但它只读取了前15列,即s的长度。


1
你需要生成一个列的列表,并将其传递给 parse_cols,例如 parse_cols=[0, 22,23,24.....,37],而不是你现在正在做的。 - EdChum
不确定为什么它没有起作用,可能是一个bug,当你传递一个硬编码列表时会发生什么:df = pd.read_excel(file_loc, index_col=None, na_values=['NA'], parse_cols = [0,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37) - EdChum
@EdChum,如果传递硬编码列表,则可以正常工作。 - Ana
在这种情况下,生成一个列表而不是一系列。 - EdChum
6个回答

95

您可以像这样使用列索引(字母):

import pandas as pd
import numpy as np
file_loc = "path.xlsx"
df = pd.read_excel(file_loc, index_col=None, na_values=['NA'], usecols="A,C:AA")
print(df)

相应文档

usecolsint,str,类似列表或可调用对象,默认为None

  • 如果为 None,则解析所有列。

  • 如果为 str,则表示逗号分隔的 Excel 列字母和列范围的列表(例如,“A:E”或“A、C、E:F”)。范围包括两侧。

  • 如果为 int 列表,则表示要解析的列号列表。

  • 如果为字符串列表,则表示要解析的列名称列表。

    从版本 0.24.0 开始提供。

  • 如果为可调用对象,则针对每个列名进行评估,并在可调用对象返回 True 时解析该列。

根据上述行为返回子集列。

从版本 0.24.0 开始提供。


12
需要注意的是,“名称”应该被理解为“Excel表格中的名称”,而不是您可以选择或用作标头的名称。文档对此并没有明确说明,但值得一提的是,这让我有些头痛。 - Ando Jurai

22

parse_cols 已被弃用,请使用 usecols

即:

df = pd.read_excel(file_loc, index_col=None, na_values=['NA'], usecols = "A,C:AA")

请注意我今天遇到的错误/意外行为。https://github.com/pandas-dev/pandas/issues/18273看起来在使用Excel时,使用列名不起作用... - Evan

20

"使用usecols参数"可以帮助你选择指定的列,类似于Excel中选取A、B等列。

1. 选定列

df = pd.read_excel(file_location,sheet_name='Sheet1', usecols="A,C,F")

2. 列范围和选定列

df = pd.read_excel(file_location,sheet_name='Sheet1', usecols="A:F,H")

3. 多个区间

df = pd.read_excel(file_location,sheet_name='Sheet1', usecols="A:F,H,J:N")

4. 列的范围

df = pd.read_excel(file_location,sheet_name='Sheet1', usecols="A:N")

1
有限制列数的任何想法吗? - rluts
1
@rluts,将usecols="A,C,F"替换为usecols=[0,2,5],如果是列号范围,请使用usecols=range(2,9),根据需求请替换相应的数字。 - Uday Kiran

10

如果您知道列的名称,而不想使用A、B、D或者0、4、7。这种方法真的可行。

df = pd.read_excel(url)[['name of column','name of column','name of column','name of column','name of column']]

通过指定"列名称",获取所需的列。区分大小写和空格。


2

在Excel中读取任意列的数据

import pandas as pd


name_of_file =  "test.xlsx"
data = pd.read_excel(name_of_file)

required_colum_name = "Post test Number"
print(data[required_colum_name])

-1

很不幸,这些方法似乎仍然在返回子选择之前读取和转换标题。我有一个包含多个相似表格的Excel表格,其中包含重复的标题名称。我想单独读取这些表格,所以我希望应用usecols。然而,这仍然会给重复的列名添加后缀。

复现步骤:

  • 创建一个Excel表格,列A、B、C、D下的标题分别命名为Header1、Header2、Header1、Header2
  • df.read_excel(filename, usecols='C:D')

df.columns将返回['Header1.1', 'Header2.1']

除了拆分和连接结果标题之外,是否有办法规避这个问题?特别是当不知道是否存在重复列时,重命名它们可能会出现问题,因为在'.'上拆分可能会损坏非重复的标题。

编辑:此外,基于一部分列生成的DataFrame的长度(索引)将由完整文件的长度确定。因此,如果列A有10行,而列B只有5行,通过usecols='B'生成的DataFrame将有10行,其中5行填充为NaN。


这应该作为一个单独的问题发布 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接