我大约有20 ++个xlsx文件,每个xlsx文件中可能包含不同数量的工作表。但是,感谢上帝,所有列都是所有工作表和所有xlsx文件中的一些。通过引用here“,我有了一些想法。我一直在尝试几种方法,可以将所有excel文件(所有工作表)导入并追加到单个数据帧(约400万行记录)中。
注意:我也检查了here”,但是它仅包括文件级别,我的工作文件以及工作表级别。
# import all necessary package
import pandas as pd
from pathlib import Path
import glob
import sys
# set source path
source_dataset_path = "C:/Users/aaa/Desktop/Sample_dataset/"
source_dataset_list = glob.iglob(source_dataset_path + "Sales transaction *")
for file in source_dataset_list:
#xls = pd.ExcelFile(source_dataset_list[i])
sys.stdout.write(str(file))
sys.stdout.flush()
xls = pd.ExcelFile(file)
out_df = pd.DataFrame() ## create empty output dataframe
for sheet in xls.sheet_names:
sys.stdout.write(str(sheet))
sys.stdout.flush() ## # View the excel files sheet names
#df = pd.read_excel(source_dataset_list[i], sheet_name=sheet)
df = pd.read_excel(file, sheetname=sheet)
out_df = out_df.append(df) ## This will append rows of one dataframe to another(just like your expected output)
我的方法就像首先读取每个excel文件并获取其中的工作表列表,然后加载工作表并附加所有工作表。当每个附件的数据大小增加时,循环似乎不是很有效。
答案 0 :(得分:2)
使用read_excel
中的sheet_name=None
来计算从所有工作表名称创建的DataFrame的返回顺序,然后由concat
和最后一个DataFrame.append
连接到最后一个DataFrame
:< / p>
out_df = pd.DataFrame()
for f in source_dataset_list:
df = pd.read_excel(f, sheet_name=None)
cdf = pd.concat(df.values())
out_df = out_df.append(cdf,ignore_index=True)
另一种解决方案:
cdf = [pd.read_excel(excel_names, sheet_name=None).values()
for excel_names in source_dataset_list]
out_df = pd.concat([pd.concat(x) for x in cdf], ignore_index=True)
答案 1 :(得分:1)
如果我正确理解了您的问题,请在sheet_name=None
中设置pd.read_excel
可以解决问题。
import os
import pandas as pd
path = "C:/Users/aaa/Desktop/Sample_dataset/"
dfs = [
pd.concat(pd.read_excel(path + x, sheet_name=None))
for x in os.listdir(path)
if x.endswith(".xlsx") or x.endswith(".xls")
]
df = pd.concat(dfs)
答案 2 :(得分:0)
如果您想阅读所有工作表,我有一个非常直接的解决方案。
import pandas as pd
df = pd.concat(pd.read_excel(path+file_name, sheet_name=None),
ignore_index=True)