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

use*_*ser 3 python excel concatenation pandas dictionary-comprehension

我有很多选项卡的 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
Run Code Online (Sandbox Code Playgroud)

现在,假设我的选项卡是 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)])
Run Code Online (Sandbox Code Playgroud)

我可以得到我想要的,但当然我只有一个数据框,它是每个文件中最后一个选项卡的联合。如何更改代码以便我有一个 dfs 列表,每个名称都命名为 df_alpha、df_beta 等?

Sul*_*yev 5

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

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
Run Code Online (Sandbox Code Playgroud)

稍后您可以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)
Run Code Online (Sandbox Code Playgroud)

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

更新 2:也许使用 dict 理解更“pythonic”(使用更常见的pd而不是pandas):

df_dict = {
    sheet: pd.concat(pd.read_excel(f, sheet_name=sheet) for f in files)
    for sheet in sheets
}
Run Code Online (Sandbox Code Playgroud)

这里的技巧是使用上面的片段来定义key: value字典理解。