使用 pandas 从 Excel 文件中读取最后一列

Posted

技术标签:

【中文标题】使用 pandas 从 Excel 文件中读取最后一列【英文标题】:Read the last column from an Excel file with pandas 【发布时间】:2019-07-15 00:47:55 【问题描述】:

类似于how to read certain columns from Excel using Pandas - Python,但稍微复杂一些。

假设我有一个名为“foo.xlsx”的 Excel 文件,它会随着时间的推移而增长 - 每个月都会在右侧附加一个新列。但是,当我阅读它时,我只需要前两列和最后一列。我希望usecols 参数可以解决这个问题,所以我去了df = pd.read_excel("foo.xlsx", usecols=[0, 1, -1]),但它只给了我前两列。

我的解决方法是:

df = pd.read_excel("foo.xlsx")
df = df[df.columns[[0, 1, -1]]]

但它每次都需要读取整个文件。有什么方法可以在读取文件时获得我想要的数据框?谢谢。

【问题讨论】:

@Nihal 你能详细说明你的观点吗? pandas 确实支持读取具有指定列的文件,但我问的是如何始终获取最后一个。 我想指定usecols 参数不会节省很多时间,因为read_excel 总是读取整张纸。 usecols 只是在阅读完所有内容后跳过其余部分,只会加速解析。 【参考方案1】:

如果您真的想这样做(请参阅我上面的评论),您可以这样做:

xl = pd.ExcelFile(file)
ncols = xl.book.sheets()[0].ncols
df = xl.parse(0, usecols=[0, 1, ncols-1])

此解决方案不会读取 excel 文件两次。

【讨论】:

只是出于好奇,xl.book.sheets()[0].ncols 不需要阅读整个 Excel 文件才能得到答案吗?我检查了ExcelFile Vs. read_excel in pandas,我想知道这个解决方案如何更好。 是的,它必须读取整个文件。但是下面的 parse 命令不必再次 id。所以总体上没有赢得多少,但没有做两次(与jezreal的回答相反)【参考方案2】:

一个想法是获取column count 并传递给usecols

from openpyxl import load_workbook

path = "file.xlsx"

wb = load_workbook(path)
sheet = wb.worksheets[0]
column_count = sheet.max_column
print (column_count)

或者只读取文件的第一行:

column_count  = len(pd.read_excel(path, nrows=0).columns)

df = pd.read_excel(path, usecols=[0, 1, column_count-1])
print (df)

【讨论】:

这是次优的,因为 excel 文件将被读取两次,这对于大文件来说非常耗时。【参考方案3】:

您可以使用 df.head() 和 df.tail() 读取前 2 行和最后一行。例如:

df = pd.read_excel("foo.xlsx", sheet_name='ABC')
#print the first 2 column
print(df.head(2))
#print the last column
print(df.tail(1))

编辑:糟糕,上面的代码读取的是行而不是列。是的,您必须每次都阅读该文件。我认为没有读取部分文件的选项。

对于阅读专栏,也许你可以这样做

df['Column Name'][index]

【讨论】:

您的答案提供的是行,而不是列。此外,当文件随时间变大时,它不能阻止读取整个文件。

以上是关于使用 pandas 从 Excel 文件中读取最后一列的主要内容,如果未能解决你的问题,请参考以下文章

使用 python/pandas 从特定文件夹中读取几个嵌套的 .json 文件到 excel 中

使用 lambda 中的 pandas 从 s3 读取 excel 文件并转换为 csv

pandas读取excel文件出错啥原因?

使用 pandas 读取和编辑 excel 文件

python pandas怎么跳读sheet?

Pandas只提供了读取啥文件的函数?