동일한 통합 문서의 여러 워크 시트에 대해 판다를 사용하여 pd.read_excel ()


166

파이썬 팬더를 사용하여 처리하는 큰 스프레드 시트 파일 (.xlsx)이 있습니다. 큰 파일에서 두 개의 탭의 데이터가 필요합니다. 탭 중 하나에는 많은 양의 데이터가 있고 다른 하나는 몇 정사각형 셀입니다.

모든 워크 시트에서 pd.read_excel () 을 사용 하면 전체 파일이로드 된 것처럼 보입니다 (관심이있는 워크 시트뿐만 아니라). 따라서이 방법을 두 번 사용하면 (각 시트마다 한 번씩) 전체 통합 문서를 두 번 읽습니다 (지정된 시트 만 사용하더라도).

내가 잘못 사용하고 있거나 이런 식으로 제한되어 있습니까?

감사합니다!


답변:


244

시도 pd.ExcelFile:

xls = pd.ExcelFile('path_to_file.xls')
df1 = pd.read_excel(xls, 'Sheet1')
df2 = pd.read_excel(xls, 'Sheet2')

@HaPsantran이 지적했듯이 ExcelFile()통화 중에 전체 Excel 파일을 읽습니다 (이 주위에는 방법이없는 것으로 보입니다). 이렇게하면 새 시트에 액세스 할 때마다 동일한 파일을 읽을 필요가 없습니다.

점을 유의 sheet_name인수가 pd.read_excel()(상기와 같이) 시트의 이름이 될 수있는 시트 수를 나타내는 정수 (예를 들면 0, 1, 등), 시트 이름이나 인덱스 또는 목록 None. 목록이 제공되면 키가 시트 이름 / 표시이고 값이 데이터 프레임 인 사전을 반환합니다. 기본값은 단순히 첫 번째 시트 (예 :)를 반환하는 것 sheet_name=0입니다.

경우 None지정, 모든 시트는 같은 반환됩니다 {sheet_name:dataframe}사전.


4
FWIW, 그것은 (마지막으로 테스트했을 때) 모든 것의 첫 번째 라인로드처럼 보이 므로 단일 시트를 효율적으로 잡아 당기는 방법은 없지만 적어도 여러 시트를 얻는 것은 전체 시트를 여러 번로드 할 필요가 없습니다.
HaPsantran

1
이 답변은 팬더에 의해 더 이상 사용되지 않으며 이제 v0.21.0에서 충돌합니다. @ Mat0kan이 제공 한 것으로 바꿔야합니다.
DStauffman

1
@DStauffman 이것은 여전히 ​​잘 작동하며 코드 또는 문서에서 이것이 더 이상 사용되지 않는다는 표시가 없습니다. 문제가 발생하면 팬더 또는 xlrd (팬더가 사용하는 Python Excel 구문 분석 라이브러리)에 대한 github에 문제를 제출하십시오.
Noah

@ Noah, 나는 이것에 대해 좀 더 조사해 보았고 당신이 옳습니다. 아직 사용 sheet_name하지 않고 계속 작동 sheetname합니다. 그것이 read_excel 메소드에서 여전히 작동하고 있지만 구문 분석 메소드에서는 작동하지 않기 때문에 더 이상 사용되지 않는 부분이라는 것을 알지 못했습니다.
DStauffman

@Noah 사실 좋은 답변입니다. 읽은 엑셀 시트에서 활성 셀을 찾는 방법이 있습니까?
Eswar

97

3 가지 옵션이 있습니다 :

모든 시트를 정렬 된 사전으로 직접 읽으십시오.

import pandas as pd

# for pandas version >= 0.21.0
sheet_to_df_map = pd.read_excel(file_name, sheet_name=None)

# for pandas version < 0.21.0
sheet_to_df_map = pd.read_excel(file_name, sheetname=None)

그것을 지적 해 준 @ihightower와 버전 문제를 지적한 @toto_tico에게 감사한다.

첫 번째 시트를 데이터 프레임으로 직접 읽습니다.

df = pd.read_excel('excel_file_path.xls')
# this will read the first sheet into df

Excel 파일을 읽고 시트 목록을 얻으십시오. 그런 다음 시트를 선택하여 넣습니다.

xls = pd.ExcelFile('excel_file_path.xls')

# Now you can list all sheets in the file
xls.sheet_names
# ['house', 'house_extra', ...]

# to read just one sheet to dataframe:
df = pd.read_excel(file_name, sheetname="house")

모든 시트를 읽고 사전에 저장하십시오. 처음과 동일하지만보다 명시 적입니다.

# to read all sheets to a map
sheet_to_df_map = {}
for sheet_name in xls.sheet_names:
    sheet_to_df_map[sheet_name] = xls.parse(sheet_name)

업데이트 : 버전 문제를 지적한 @toto_tico에게 감사드립니다.

시트 이름 : 문자열, INT, 문자열 / int 치의 또는 없음의 혼합 목록, 기본 0 비추천 API 버전 0.21.0 가입일 : 사용 SHEET_NAME 대신 원본 링크


12
내가 (0.20.3)을 가지고 최신 팬더에 .. 필요한 모든이지도에 모든 시트를 읽을 수있는 df_sheet_map = pd.read_excel(file_fullpath, sheetname=None)이 같은 dataframe로 시트를이 자동으로 사전에 시트를해야합니다 .. 및 액세스 :df_sheet_map['house']
ihightower

32

시트에 색인을 사용할 수도 있습니다.

xls = pd.ExcelFile('path_to_file.xls')
sheet1 = xls.parse(0)

첫 번째 워크 시트를 제공합니다. 두 번째 워크 시트의 경우 :

sheet2 = xls.parse(1)

7
xls.sheet_names
Stefano Fedele

28

시트 이름을 매개 변수로 지정할 수도 있습니다.

data_file = pd.read_excel('path_to_file.xls', sheet_name="sheet_name")

시트 만 업로드합니다 "sheet_name".


9
pd.read_excel('filename.xlsx') 

기본적으로 통합 문서의 첫 번째 시트를 읽습니다.

pd.read_excel('filename.xlsx', sheet_name = 'sheetname') 

통합 문서의 특정 시트를 읽고

pd.read_excel('filename.xlsx', sheet_name = None) 

Excel에서 Pandas 데이터 프레임까지의 모든 워크 시트를 OrderedDict 유형으로 중첩 된 데이터 프레임을 의미하며 모든 워크 시트는 데이터 프레임 내부에 수집 된 데이터 프레임으로, 형식은 OrderedDict입니다.


1

예, 불행히도 항상 전체 파일을로드합니다. 이 작업을 반복적으로 수행하는 경우 시트를 추출하여 CSV를 분리 한 다음 별도로로드하는 것이 가장 좋습니다. d6tstack 을 사용 하여 해당 프로세스를 자동화 할 수 있으며, 모든 시트 또는 여러 Excel 파일에서 모든 열이 동일한 지 확인하는 등의 추가 기능이 추가됩니다.

import d6tstack
c = d6tstack.convert_xls.XLStoCSVMultiSheet('multisheet.xlsx')
c.convert_all() # ['multisheet-Sheet1.csv','multisheet-Sheet2.csv']

d6tstack Excel 예제 참조


0

엑셀 파일을 파이썬 프로그램 (상대 주소 지정)과 같은 폴더에 저장했다면 파일 이름과 함께 시트 번호를 언급하면됩니다. 구문 = pd.read_excel (파일 이름, 시트 번호) 예 :

    data=pd.read_excel("wt_vs_ht.xlsx","Sheet2")
    print(data)
    x=data.Height
    y=data.Weight
    plt.plot(x,y,'x')
    plt.show()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.