连接 excel 文件中的所有工作表,其中一些具有不同的 skiprows 标准
concatenate all sheets in the excel file, some of which have a different skiprows criteria
我有一个 Excel 工作簿,里面有 8 sheet 个。它们都遵循相同的列 header 结构。唯一的区别是,第一个 sheet 从第 1 行开始,而其余的 sheet 从第 4 行开始。
我正在尝试 运行 这样的命令,但这给了我错误的数据 - 我认识到因为我写了 sheet_name=None
这会给我带来问题,因为 sheets 从不同的行开始:
df = pd.concat(pd.read_excel(xlsfile, sheet_name=None, skiprows=4), sort=True)
我的下一次尝试是:
frames = []
df = pd.read_excel(xlsfile, sheet_name='Questionnaire')
for sheet in TREND_SHEETS:
tmp = pd.read_excel(xlsfile, sheet_name=sheet, skiprows=4)
# append tmp dynamically to frames, then use concat frames at the end.. ugly
df.append(tmp, sort=False)
return df
注意,Questionnaire
是 Excel 工作簿中的第一个 sheet。我知道这里的逻辑是关闭的,我不想创建包含 'tmp' 的动态变量,将其附加到列表,然后连接帧。
我该如何解决这个问题,以便获得一个包含所有 sheet 数据的数据框?
我要做的是有一个配置文件,比如一个 python 字典,以工作表名称作为键,值可以是要跳过的 number_of_rows:
已编辑:感谢@parfait 提供更好的解决方案,最好在 for 循环之外连接,因为它的内存效率更高。您可以做什么将 dfs 附加到 for 循环内的列表,然后在外部连接。
import pandas as pd
sheets = {
'Sheet1': 1,
'Sheet2': 4,
'Sheet3': 4,
'Sheet4': 4
}
list_df = list()
for k, v in sheets.items():
tmp = pd.read_excel(xlsfile, sheetname=k, skiprows=v)
list_df.append(tmp)
final_df = pd.concat(list_df, ignore_index=True)
希望对您有所帮助!
考虑列表理解来构建数据帧列表,以便在循环外连接 一次。借用@Carson的字典做法:
sheets = {'sheet1': 1, 'sheet2': 4, 'sheet3': 4, 'sheet4': 4}
df_list = [pd.read_excel(xlsfile, sheetname=k, skiprows=v) \
for k,v in sheets.items()]
final_df = pd.concat(df_list, ignore_index=True)
我有一个 Excel 工作簿,里面有 8 sheet 个。它们都遵循相同的列 header 结构。唯一的区别是,第一个 sheet 从第 1 行开始,而其余的 sheet 从第 4 行开始。
我正在尝试 运行 这样的命令,但这给了我错误的数据 - 我认识到因为我写了 sheet_name=None
这会给我带来问题,因为 sheets 从不同的行开始:
df = pd.concat(pd.read_excel(xlsfile, sheet_name=None, skiprows=4), sort=True)
我的下一次尝试是:
frames = []
df = pd.read_excel(xlsfile, sheet_name='Questionnaire')
for sheet in TREND_SHEETS:
tmp = pd.read_excel(xlsfile, sheet_name=sheet, skiprows=4)
# append tmp dynamically to frames, then use concat frames at the end.. ugly
df.append(tmp, sort=False)
return df
注意,Questionnaire
是 Excel 工作簿中的第一个 sheet。我知道这里的逻辑是关闭的,我不想创建包含 'tmp' 的动态变量,将其附加到列表,然后连接帧。
我该如何解决这个问题,以便获得一个包含所有 sheet 数据的数据框?
我要做的是有一个配置文件,比如一个 python 字典,以工作表名称作为键,值可以是要跳过的 number_of_rows:
已编辑:感谢@parfait 提供更好的解决方案,最好在 for 循环之外连接,因为它的内存效率更高。您可以做什么将 dfs 附加到 for 循环内的列表,然后在外部连接。
import pandas as pd
sheets = {
'Sheet1': 1,
'Sheet2': 4,
'Sheet3': 4,
'Sheet4': 4
}
list_df = list()
for k, v in sheets.items():
tmp = pd.read_excel(xlsfile, sheetname=k, skiprows=v)
list_df.append(tmp)
final_df = pd.concat(list_df, ignore_index=True)
希望对您有所帮助!
考虑列表理解来构建数据帧列表,以便在循环外连接 一次。借用@Carson的字典做法:
sheets = {'sheet1': 1, 'sheet2': 4, 'sheet3': 4, 'sheet4': 4}
df_list = [pd.read_excel(xlsfile, sheetname=k, skiprows=v) \
for k,v in sheets.items()]
final_df = pd.concat(df_list, ignore_index=True)