Excel 시트를 통해 Python 루프, 한 쪽에 배치
엑셀 파일을 가지고 있습니다.foo.xlsx
약 40장으로sh1
,sh2
등. 각 시트의 형식은 다음과 같습니다.
area cnt name\nparty1 name\nparty2
blah 9 5 5
word 3 7 5
각 시트에서 형식을 사용하여 변수의 이름을 변경합니다.name\nparty
오직 그것만 가지고 있습니다.party
꼬리표로서출력 예:
area cnt party1 party2 sheet
bacon 9 5 5 sh1
spam 3 7 5 sh1
eggs 2 18 4 sh2
파일에서 다음 내용을 읽고 있습니다.
book = pd.ExcelFile(path)
그리고 제가 해야 할 일이 있는지 궁금합니다.
for f in filelist:
df = pd.ExcelFile.parse(book,sheetname=??)
'more operations here'
# only change column names 2 and 3
i, col in enumerate(df):
if i>=2 and i<=3:
new_col_name = col.split("\n")[-1]
df[new_col_name] =
아니면 그런 것들?
그read_excel
의 방법pandas
키워드 매개 변수를 설정하면 모든 시트를 한 번에 읽을 수 있습니다.sheet_name=None
(일부 이전 버전의 경우)pandas
이것은 이라고 불렸습니다.sheetname
) 그러면 사전이 반환됩니다. 키는 시트 이름이고 값은 시트를 데이터 프레임으로 사용합니다.
이것을 사용하면 사전을 반복해서 볼 수 있으며 다음과 같습니다.
- 관련 시트 이름이 들어 있는 데이터 프레임에 열을 추가합니다.
- 사용
rename
열 이름을 변경하는 방법 - 를 사용하여lambda
새 줄이 있을 때마다 각 열 이름을 분할하여 얻은 목록의 최종 항목을 가져갑니다.새 줄이 없는 경우 열 이름은 변경되지 않습니다. - 목록에 추가하고 마지막에 결합합니다.
이 작업이 완료되면 모든 시트를 하나로 결합합니다.pd.concat
그런 다음 지수를 재설정하면 모든 것이 좋아질 것입니다.참고: 한 시트에 당사자가 있지만 다른 시트에는 없는 경우에도 이 방법은 계속 작동하지만 각 시트의 누락된 열은 다음으로 채웁니다.NaN
.
import pandas as pd
sheets_dict = pd.read_excel('Book1.xlsx', sheet_name=None)
all_sheets = []
for name, sheet in sheets_dict.items():
sheet['sheet'] = name
sheet = sheet.rename(columns=lambda x: x.split('\n')[-1])
all_sheets.append(sheet)
full_table = pd.concat(all_sheets)
full_table.reset_index(inplace=True, drop=True)
print(full_table)
인쇄:
area cnt party1 party2 sheet
0 bacon 9 5 5 Sheet1
1 spam 3 7 5 Sheet1
2 eggs 2 18 4 Sheet2
Panda 라이브러리를 사용하는 경우에도 다음 코드를 고려합니다.
그것은 한 장의 시트만 사용하고 df's를 사용합니다.iterrows()
:
def read_csv():
filename = "file.xlsx"
sheet_name = "Sheet Name"
df = pd.read_excel(filename, sheet_name=sheet_name)
# Updating Nan to null
df = df.where(pd.notnull(df), None)
data = []
for index, row in df.iterrows():
# you can take data as row[COLUMN_NAME], then append it to data like data.append({'column': row[column})
return data
질문과 완전히 관련이 있는 것은 아닙니다.필요한 모든 사람들을 위해 포스팅하는 것.
엑셀 파일이 정말 큰 경우에는 전체 파일을 메모리로 읽는 대신 시트를 하나씩 읽어보는 것이 좋습니다.사용할 수 있습니다.ExcelFile
:
with pd.ExcelFile('foo.xlsx') as f:
sheets = f.sheet_names
for sht in sheets:
df = f.parse(sht)
# do something with df
즉, 모든 시트를 하나의 프레임으로 연결하는 작업인 경우 다음과 같은 하나의 라이너도 사용할 수 있습니다.
joined_df = pd.concat(pd.read_excel('foo.xlsx', sheet_name=None).values(), ignore_index=True)
또는 OP의 특정한 경우, 전달.names
각 시트의 열 이름을 덮어쓰고(각 시트에서 작동할 수 없음) 모든 열을 연결합니다.
joined_df = (
pd.concat(pd.read_excel('foo.xlsx', names=['area','cnt','party1','party2'], sheet_name=None))
.rename_axis(['Sheet', None]).reset_index(level=0)
.reset_index(drop=True)
)
언급URL : https://stackoverflow.com/questions/44549110/python-loop-through-excel-sheets-place-into-one-df
'IT' 카테고리의 다른 글
PowerShell을 사용하여 관리자로 명령을 실행하시겠습니까? (0) | 2023.05.23 |
---|---|
Git 저장소에서 모든 태그 삭제 (0) | 2023.05.23 |
Postgres: "오류: 캐시된 계획은 결과 유형을 변경할 수 없습니다." (0) | 2023.05.18 |
마이크로소프트의 목적은 무엇입니까?넷 컴파일러? (0) | 2023.05.18 |
Visual Studio "모든 CPU" 대상은 무엇을 의미합니까? (0) | 2023.05.18 |