IT

Excel 시트를 통해 Python 루프, 한 쪽에 배치

itgroup 2023. 5. 23. 21:46
반응형

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) 그러면 사전이 반환됩니다. 키는 시트 이름이고 값은 시트를 데이터 프레임으로 사용합니다.

이것을 사용하면 사전을 반복해서 볼 수 있으며 다음과 같습니다.

  1. 관련 시트 이름이 들어 있는 데이터 프레임에 열을 추가합니다.
  2. 사용rename열 이름을 변경하는 방법 - 를 사용하여lambda새 줄이 있을 때마다 각 열 이름을 분할하여 얻은 목록의 최종 항목을 가져갑니다.새 줄이 없는 경우 열 이름은 변경되지 않습니다.
  3. 목록에 추가하고 마지막에 결합합니다.

이 작업이 완료되면 모든 시트를 하나로 결합합니다.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

반응형