Pandas 通过预定义的工作表在文件夹中连接多个 excel 文件

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

我正在尝试使用预定义的工作表名称连接文件夹中的多个文件(因为每个文件都有一些我不想连接的工作表),但我遇到了如下问题。我正在尝试使用以下代码:

from pathlib import Path
import pandas as pd
import glob
import io
folder = Path(r'D:\Test\New folder')

for file in folder.glob('*xlsx'):
    sheet_name = ['총','하노이', '호치민', '박닌', '빈증', '동나이', '비엔화', '다낭', '타이응웬',
                  '하이퐁', '호안끼엠', '스타레이크', '하남', '빈푹', '푸미흥', '껀터', '사이공']
    dfs = []
    for x in sheet_name:
        df = pd.read_excel(file, sheet_name=x)
        base_date = df.iloc[0, 10]
        branch = df.iloc[1, 12]
        df.columns = df.iloc[2]
        df = df[3:]
        # Xóa cột NaN
        df = df.loc[:, df.columns.notnull()]
        df_2 = df.iloc[:, 0:4]
        df_3 = df.iloc[:, 4:]
        df = pd.concat([df_2, df_3], axis=0, ignore_index=True)
        df['Base Date'] = base_date
        df['Base Date'] = pd.to_datetime(df['Base Date'], format='%d-%m-%Y').dt.strftime('%Y%m%d').astype(int)
        df['Branch'] = branch
        dfs.append(df)

    output = pd.concat(dfs, axis=0, ignore_index=True)
    print(output)

它引发了错误,表示

ValueError: Worksheet named '' not found
(因为在我的文件中可能没有我预先定义的工作表)。所以我尝试使用下面的代码:

from pathlib import Path
import pandas as pd
import glob
import io
folder = Path(r'D:\Test\New folder')

for file in folder.glob('*xlsx'):
    sheet_name = ['총','하노이', '호치민', '박닌', '빈증', '동나이', '비엔화', '다낭', '타이응웬',
                  '하이퐁', '호안끼엠', '스타레이크', '하남', '빈푹', '푸미흥', '껀터', '사이공']
    dfs = []
    for x in sheet_name:
        try:
            df = pd.read_excel(file, sheet_name=x)
            base_date = df.iloc[0, 10]
            branch = df.iloc[1, 12]
            df.columns = df.iloc[2]
            df = df[3:]
            # Xóa cột NaN
            df = df.loc[:, df.columns.notnull()]
            df_2 = df.iloc[:, 0:4]
            df_3 = df.iloc[:, 4:]
            df = pd.concat([df_2, df_3], axis=0, ignore_index=True)
            df['Base Date'] = base_date
            df['Base Date'] = pd.to_datetime(df['Base Date'], format='%d-%m-%Y').dt.strftime('%Y%m%d').astype(int)
            df['Branch'] = branch
            dfs.append(df)
        except ValueError as e:
            pass
    output = pd.concat(dfs, axis=0, ignore_index=True)
    print(output)

但是使用这段代码,它只适用于最后一个文件。我怎样才能实现我的目标? 以下是示例数据的链接:https://github.com/hoatranobita/concat

python pandas concatenation
1个回答
0
投票

代码

我认为,如果问题在不发布整个代码的情况下被隔离,那么大多数问题都可以通过提供可重现的代码来解决。不过,既然你说你无法创建,而且很难通过提示找到答案,那我就给你创建一次吧。

import pandas as pd

url1 = 'https://github.com/hoatranobita/concat/blob/main/20191231%20%EC%98%81%EC%97%85%EC%A0%90%20%EC%8B%A4%EC%A0%81%20%EA%B3%84%EC%82%B0%ED%91%9C_v1.xlsx?raw=ture'
url2 = 'https://github.com/hoatranobita/concat/blob/main/20200630%20%EC%98%81%EC%97%85%EC%A0%90%20%EC%8B%A4%EC%A0%81%20%EA%B3%84%EC%82%B0%ED%91%9C_v1.xlsx?raw=true'
files = [url1, url2] # 두개의 파일 경로명이 담긴 리스트, 본문의 folder.glob('*xlsx') 역할을 한다

dfs1 = [] # 매 파일마다 reset되는 output을 reset되기 전에 저장할 변수

for file in files: # files가 본문의 folder.glob('*xlsx') 역할을 한다
    sheet_name = ['하노이', '호치민'] # minimalize
    dfs = []
    for x in sheet_name:
        try:
            df = pd.read_excel(file, sheet_name=x)
            base_date = df.iloc[0, 10]
            branch = df.iloc[1, 12]
            df.columns = df.iloc[2]
            df = df[3:]
            # Xóa cột NaN
            df = df.loc[:, df.columns.notnull()]
            df_2 = df.iloc[:, 0:4]
            df_3 = df.iloc[:, 4:]
            df = pd.concat([df_2, df_3], axis=0, ignore_index=True)
            df['Base Date'] = base_date
            df['Base Date'] = pd.to_datetime(df['Base Date'], format='%d-%m-%Y').dt.strftime('%Y%m%d').astype(int)
            df['Branch'] = branch
            dfs.append(df)
        except ValueError as e:
            pass
    output = pd.concat(dfs, axis=0, ignore_index=True)
    dfs1.append(output) # output을 dfs1에 저장
out = pd.concat(dfs1) # 저장된 output들을 concat해서 새로운 변수 out으로 지정

代码中的变量

output
会针对每个文件重置,因此您需要创建一个对象来接收和存储它(此处为变量
dfs1
)。这样就可以解决问题了。

我认为你的for循环内的代码也应该改进,但是代码的工作并不重要,所以我保留了你的代码原样。

© www.soinside.com 2019 - 2024. All rights reserved.