我正在尝试使用预定义的工作表名称连接文件夹中的多个文件(因为每个文件都有一些我不想连接的工作表),但我遇到了如下问题。我正在尝试使用以下代码:
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
代码
我认为,如果问题在不发布整个代码的情况下被隔离,那么大多数问题都可以通过提供可重现的代码来解决。不过,既然你说你无法创建,而且很难通过提示找到答案,那我就给你创建一次吧。
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循环内的代码也应该改进,但是代码的工作并不重要,所以我保留了你的代码原样。