【问题标题】:How can I read a range('A5:B10') and place these values into a dataframe using openpyxl如何读取范围('A5:B10')并使用 openpyxl 将这些值放入数据框中
【发布时间】:2017-09-05 18:44:40
【问题描述】:

能够以类似于 excel 的方式定义范围,即“A5:B10”对我需要的内容很重要,因此将整个工作表读取到数据框并不是很有用。

所以我需要做的是将 Excel 工作表中多个范围的值读取到多个不同的数据框。

valuerange1 = ['a5:b10']
valuerange2 = ['z10:z20']
df = pd.DataFrame(values from valuerange)
df = pd.DataFrame(values from valuerange1)

df = pd.DataFrame(values from ['A5:B10'])

我已经搜索过,但要么我的搜索工作做得很差,要么其他人都解决了这个问题,但我真的做不到。

谢谢。

【问题讨论】:

  • 所以澄清一下,您想要实现的是在 pandas DataFrame 中加载 excel 工作表的一部分?或者您是否需要以类似 excel 的语法选择部分数据框?
  • 我刚刚编辑了帖子。希望这能回答您的问题,但要澄清一下,我需要将部分 excel 工作表加载到不同的数据框中。
  • 从您的评论来看,我是否理解正确,不能将完整的 excel 文件加载到内存中?
  • 如果这是您所指的,我可以使用 openpyxl.load_workbook。我目前正在使用 panads.read_excel 加载整个工作表。然后我将这个数据框的多个范围定义为我需要的数据的值。这很麻烦,因为我需要手动找出我需要哪些行和列,但这不是最大的问题。我试图使这个脚本非常用户友好,这意味着排除 excel 范围而不是使用 iloc。
  • 我对我的答案进行了编辑,显示了一个使用 openpyxl 的非常用户友好的解决方案。

标签: python excel python-3.x pandas openpyxl


【解决方案1】:

最简单的方法是使用 pandas 从 excel 中获取值的范围。

import pandas as pd

#if you want to choose single range, you can use the below method
src=pd.read_excel(r'August.xlsx',usecols='A:C',sheet_name='S')

#if you have multirange, which means a dataframe with A:S and as well some other range
src=pd.read_excel(r'August.xlsx',usecols='A:C,G:I',sheet_name='S')

【讨论】:

    【解决方案2】:

    使用 openpyxl

    既然您已经表明,您正在寻找一种非常用户友好的方式来指定范围(如 excel 语法),并且正如查理克拉克已经建议的那样,您可以使用 openpyxl。

    以下实用程序函数采用工作簿和列/行范围并返回 pandas DataFrame:

    from openpyxl import load_workbook
    from openpyxl.utils import get_column_interval
    import re
    
    def load_workbook_range(range_string, ws):
        col_start, col_end = re.findall("[A-Z]+", range_string)
    
        data_rows = []
        for row in ws[range_string]:
            data_rows.append([cell.value for cell in row])
    
        return pd.DataFrame(data_rows, columns=get_column_interval(col_start, col_end))
    

    用法:

    wb = load_workbook(filename='excel-sheet.xlsx', 
                       read_only=True)
    ws = wb.active
    load_workbook_range('B1:C2', ws)
    

    输出:

       B  C
    0  5  6
    1  8  9
    

    熊猫专用解决方案

    在 Excel 工作表中给出以下数据:

        A   B   C
    0   1   2   3
    1   4   5   6
    2   7   8   9
    3  10  11  12
    

    您可以使用以下命令加载它: pd.read_excel('excel-sheet.xlsx')

    如果您要限制正在读取的数据,pandas.read_excel 方法提供了许多选项。使用parse_colsskiprowsskip_footer 选择您要加载的特定子集:

    pd.read_excel(
        'excel-sheet.xlsx',    # name of excel sheet
        names=['B','C'],       # new column header
        skiprows=range(0,1),   # list of rows you want to omit at the beginning
        skip_footer=1,         # number of rows you want to skip at the end
        parse_cols='B:C'       # columns to parse (note the excel-like syntax)
    )
    

    输出:

       B  C
    0  5  6
    1  8  9
    

    一些注意事项:

    read_excel 方法的 API 并不意味着支持更复杂的选择。如果您需要复杂的过滤器,将整个数据加载到 DataFrame 并使用出色的切片和索引机制provided by pandas 会更容易(也更干净)。

    【讨论】:

    • read_excel 方法是我目前使用的方法,但需要我做的是通过列号和行号手动选择 8 个不同的范围。虽然这对我来说很好,但我正在努力使这个当前的脚本更加用户友好,这意味着我需要使用给定“A5:c10”格式的范围,以便其他用户可以更轻松地更改这个范围。不过很感谢你的建议
    • 不需要使用正则表达式的额外函数:ws['A1:B5'] 工作正常。
    • 好话。但是,是否可以选择获取 pandas DataFrame 的列?我将它用作 pd.DataFrame 调用中的列数组
    • 我还没有机会尝试,但我想说声谢谢。似乎是一个完美的解决方案。感谢您的回复。非常感谢。
    • @CharlieClark 我已经相应地编辑了我的答案。如果列标题包含在数据本身中,也可以摆脱正则表达式。但是由于range是指excel的列名,所以在创建数据框的时候需要切片后恢复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-09
    • 2017-06-28
    • 1970-01-01
    • 2013-11-23
    • 1970-01-01
    • 2018-03-08
    相关资源
    最近更新 更多