使用列表中的名称创建数据框

Create dataframes with names from a list

我有 excel 个包含许多选项卡的文件。我想连接所有这些,一次一个标签。

我在做:

mypath = "mypath"
files = os.listdir(mypath)
files = [os.path.join(mypath,f) for f in files if f[-4:]=='xlsx']

sheets = pandas.ExcelFile(files[0]).sheet_names

现在,假设我的选项卡是 alpha、beta、gamma 等,我想创建一个数据框列表 df_alpha、df_beta 等,它们是所有 alpha 的联合我的目录中文件的选项卡。

通过做:

for sheet in sheets:
    df = pandas.DataFrame()
    for f in files:
        df = pandas.concat([df, pandas.read_excel(f, sheet_name=sheet)])

我可以得到我想要的,但当然我只有一个数据框,它是每个文件中最后一个选项卡的并集。我怎样才能更改代码,以便我有一个 dfs 列表,每个命名为 df_alpha、df_beta 等?

如果您可以使用数据框字典,以下内容可能会有所帮助:

df_dict = {}
for sheet in sheets:
    df = pandas.DataFrame()
    for f in files:
        df = pandas.concat([df, pandas.read_excel(f, sheet_name=sheet)])
    df_dict[sheet] = df

稍后您可以使用它的键从字典中调用相关的 df,例如df_dict['alpha'].

更新:如@ALollz 的评论所述,上面的代码片段效率低下,因为对同一数据帧进行了多次连接。所以更有效的方法是:

df_dict = {}
for sheet in sheets:
    df_dict[sheet] = pandas.concat(pandas.read_excel(f, sheet_name=sheet) for f in files)

请注意,在这种情况下,可以不在 pandas.concat 中定义显式列表理解(内部表达式成为生成器)。

更新 2:也许使用字典理解更多 'pythonic'(使用更常见的 pd 而不是 pandas):

df_dict = {
    sheet: pd.concat(pd.read_excel(f, sheet_name=sheet) for f in files)
    for sheet in sheets
}

这里的诀窍是使用上面的代码片段来定义 key: value 和字典理解。