Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何读取范围(';A5:B10';)并使用openpyxl将这些值放入数据帧_Python_Excel_Python 3.x_Pandas_Openpyxl - Fatal编程技术网

Python 如何读取范围(';A5:B10';)并使用openpyxl将这些值放入数据帧

Python 如何读取范围(';A5:B10';)并使用openpyxl将这些值放入数据帧,python,excel,python-3.x,pandas,openpyxl,Python,Excel,Python 3.x,Pandas,Openpyxl,能够以类似于excel的方式定义范围,即“A5:B10”对于我所需要的很重要,因此将整个工作表读取到数据框中并不是很有用 因此,我需要做的是将Excel工作表中多个范围的值读取到多个不同的数据帧 valuerange1 = ['a5:b10'] valuerange2 = ['z10:z20'] df = pd.DataFrame(values from valuerange) df = pd.DataFrame(values from valuerange1) 或 我已经搜索过了,但要么我搜

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

因此,我需要做的是将Excel工作表中多个范围的值读取到多个不同的数据帧

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

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

谢谢

使用openpyxl 因为您已经指出,您正在寻找一种非常用户友好的方法来指定范围(如excel语法),正如Charlie Clark所建议的,您可以使用openpyxl

以下实用程序函数接受工作簿和列/行范围,并返回数据帧:

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
   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\u excel('excel-sheet.xlsx')

如果要限制读取的数据,该方法提供了许多选项。使用
parse_cols
skiprows
skip_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
   B  C
0  5  6
1  8  9
一些注意事项:

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

read_excel方法的API不支持更复杂的选择。如果您需要一个复杂的过滤器,那么将整个数据加载到一个数据帧中并使用优秀的切片和索引机制会更容易(更干净)。

使用openpyxl可以相当轻松地完成这项工作。看。当然,这也适用于单元格范围。

因此,为了澄清,您想要实现的是将excel工作表的一部分加载到数据框中?或者你需要用类似excel的语法选择部分数据框吗?我刚刚编辑了这篇文章。希望这能回答您的问题,但为了澄清,我需要将excel工作表的一部分加载到不同的数据框中。根据您的评论判断,我是否正确理解您,将完整的excel文件加载到内存中不是一个选项?如果您指的是openpyxl.load_工作簿,我可以使用它。我目前正在使用panads.read\u excel加载整个工作表。然后,我将这个数据帧的多个范围定义为我需要的数据值。这很麻烦,因为我需要手动确定需要哪些行和列,但这并不是最大的问题。我试图使这个脚本非常用户友好,这意味着除了excel范围之外,而不是使用iloc。我对我的答案进行了编辑,显示了一个使用openpyxl的非常用户友好的解决方案。read_excel方法是我目前使用的方法,但需要我做的是根据列号和行号。虽然这对我来说很好,但我正在尝试使当前脚本更加用户友好,这意味着我需要使用给定“A5:c10”格式的范围,以便其他用户可以更轻松地更改此范围。我很感激你的建议,虽然没有必要使用带有正则表达式的额外函数:
ws['A1:B5']
工作得很好。说得好。但是,是否有一个选项可以获取数据帧的列?我正在使用它作为pd中的列数组。DataFrame callI还没有机会尝试它,但我想说声谢谢。这似乎是一个完美的解决方案。谢谢你的回复。非常感谢。@charlechucklark我已经相应地编辑了我的答案。如果列标题包含在数据本身中,也可以去掉正则表达式。但由于该范围是指excel列名,因此在创建数据框时,需要在切片后还原这些列名。很抱歉,此页面不存在。