使用 xlwings 将整张表放入 pandas 数据框

问题描述 投票:0回答:6

感谢 pandas,我们可以使用“read_excel”函数将整张工作表读入数据框。

我想使用 xlwings 使用相同的方法。事实上,我的工作簿已经打开,我不想使用 read_excel 函数(顺便说一句,执行起来会花费太长时间),而是使用 xlwings 的功能将整张工作表保存到数据框中。

事实上,使用 xlwings,我们可以将范围保存到数据框中。这意味着我必须知道范围大小。但我想有更好(更快!)的方法来做到这一点,不是吗?

您有什么想法吗? 非常感谢!

编辑: 我想将一张纸的一个示例转移到数据框中,因为 read_excel 可以做到这一点。

Name Point  Time    Power   Test1   Test2   Test3   Test4 ##
Test    0   1   10  4   24  144
        2   20  8   48  288
        3   30  12  72  432
        4   40  16  96  576
        5   50  20  120 720
        6   60  24  144 864
        7   70  28  168 1008
        8   80  32  192 1152
        9   90  36  216 1296
        10  100 40  240 1440
        11  110 44  264 1584
        12  120 48  288 1728
python excel pandas xlwings
6个回答
20
投票

您可以使用内置的转换器将其放入一行:

df = sht.range('A1').options(pd.DataFrame, 
                             header=1,
                             index=False, 
                             expand='table').value

8
投票

xlwings 确实提供了 api 来加载整张纸。为此,请使用

used_range
api 读取工作表的整个已使用部分。 (当然我们不想获得未使用的行值,不是吗?;-)) 无论如何,这里有一个关于如何执行此操作的代码片段:

import pandas as pd
import xlwings as xw

workbook = xw.Book('some.xlsx')
sheet1 = workbook.sheets['sheet1'].used_range.value
df = pd.DataFrame(sheet1)

仅此而已。


4
投票

您可以使用 pandas 读取多张纸:

excel_file = pd.ExcelFile('myfile.xls')
df1 = excel_file.parse('Sheet1')
df2 = excel_file.parse('Sheet2') 

因此,只需依次打开一个文件,从所需的工作表中读取并处理数据框即可。


4
投票

事实上,我可以做类似的事情:

import xlwings as xw
import pandas as pd

def GetDataFrame(Sheet,N,M):
    wb = xw.Workbook.active()
    Data=xw.Range(Sheet,(1,1),(N,M)).value
    Data=pd.DataFrame(Data)
    Data=Data.dropna(how='all',axis=1)
    Data=Data.dropna(how='all',axis=0)
    return Data

1
投票

我花了更多时间使用 pandas.read_excel 读取 20M 的 Excel。但是xlwings读取Excel的速度非常快。我会考虑使用 xlwings 阅读并转换为 Dataframe。我想我和楼主有同样的需求。 Xlwings在这四年里做了一些调整。所以我对第一个回答者的代码做了一些修改。 `

import xlwings as xw
import pandas as pd

def GetDataFrame(wb_file,Sheets_i,N,M):
    wb = xw.books(wb_file)   #open your workbook
         #Specify the value of the cell of the worksheet
    Data=wb.sheets[Sheets_i].range((1,1),(N,M)).value  
    Data=pd.DataFrame(Data)
    Data=Data.dropna(how='all',axis=1)
    Data=Data.dropna(how='all',axis=0)
    return Data

`


0
投票

我自己做的。 它是一个通过在搜索参数中选择特定单元格位置将 startCol 和 endCol 范围内的数据转换为 Pandas 数据框的函数。 我正在分类使用它,所以我不知道它是否运行良好,但我希望它有帮助。

我使用的时候没有使用execlFilePath、sheetName、startCol、endCol,而是使用集成的cell_range来指定范围,但是如果加上这些集成的函数,代码会很长,所以我把它拉出来上传它。

import re
import pandas as pd
import xlwings as xw

def GetDataFrame(execlFilePath, sheetName, startCol=None, endCol='Z', search='A1'):
    r'''
    execlFilePath : 엑셀 파일 경로
    sheetName : 시트 이름
    startCol : 시작 열
    endCol : 끝 열
    search : 특정 데이터 검색할 cell위치
    '''
    # search 행열 분해
    searchCOL, searchROW = re.match(r'([A-Z]+)(\d+)', search).groups()

    # 시작열이 없을 경우
    if not startCol:
        startCol = searchCOL

    workbook = xw.Book(execlFilePath)
    # 시트 선택
    worksheet: xw.main.Sheet = workbook.sheets[sheetName]
    # 마지막 데이터 행번호
    row = worksheet.range(search).end('down').row
    # 데이터 가져오기
    data = worksheet.range(f'{startCol}{searchROW}:{endCol}{row}').value
    # 판다스 데이터프레임으로 변환
    return pd.DataFrame(data[1:], columns=data[0])
© www.soinside.com 2019 - 2024. All rights reserved.