【问题标题】:how to concatenate multiple excel sheets from the same file?如何连接同一个文件中的多个excel表?
【发布时间】:2018-03-18 06:29:09
【问题描述】:

我有一个很大的 Excel 文件,其中包含许多不同的工作表。所有工作表都具有相同的结构,例如:

Name
col1  col2  col3  col4
1     1     2     4
4     3     2     1
  • 如何将Pandas 中的所有这些工作表(垂直)连接起来,而不必手动命名每个工作表?如果这些是文件,我可以使用glob 来获取目录中的文件列表。但是在这里,对于 excel 表,我迷路了。
  • 有没有办法在生成的数据框中创建一个变量来标识数据来自的工作表名称?

谢谢!

【问题讨论】:

    标签: python excel pandas dataframe


    【解决方案1】:

    试试这个:

    dfs = pd.read_excel(filename, sheet_name=None, skiprows=1)
    

    这将为您返回一个 DF 字典,您可以使用 pd.concat(dfs) 或 @jezrael 已经在他的回答中发布的那样轻松连接:

    df = pd.concat(pd.read_excel(filename, sheet_name=None, skiprows=1))
    

    sheet_name:无 -> 所有工作表作为 DataFrame 的字典

    更新:

    有没有办法在结果数据框中创建一个变量 标识数据来自的工作表名称?

    dfs = pd.read_excel(filename, sheet_name=None, skiprows=1)
    

    假设我们有以下字典:

    In [76]: dfs
    Out[76]:
    {'d1':    col1  col2  col3  col4
     0     1     1     2     4
     1     4     3     2     1, 'd2':    col1  col2  col3  col4
     0     3     3     4     6
     1     6     5     4     3}
    

    现在我们可以添加一个新列:

    In [77]: pd.concat([df.assign(name=n) for n,df in dfs.items()])
    Out[77]:
       col1  col2  col3  col4 name
    0     1     1     2     4   d1
    1     4     3     2     1   d1
    0     3     3     4     6   d2
    1     6     5     4     3   d2
    

    【讨论】:

    • 然后pd.concat(dfs.values()) 产生结果。
    • 很好,但我怎样才能摆脱 Name 超级专栏?我想我可以在字典的某个地方使用一些 read_excel (skip = 1)?
    • @blacksite,是的,谢谢。我以为 OP 已经知道了... ;-)
    • @ℕʘʘḆḽḘ,使用skiprows=1
    • @ℕʘʘḆḽḘ,我已经更新了我的答案 - 这就是你想要的吗?
    【解决方案2】:

    首先添加参数sheetname=NoneDataFramesdictskiprows=1 省略第一行,然后使用concatMultiIndex DataFrame

    最后使用reset_index 表示第一级的列:

    df = pd.concat(pd.read_excel('multiple_sheets.xlsx', sheetname=None, skiprows=1))
    df = df.reset_index(level=1, drop=True).rename_axis('filenames').reset_index()
    

    【讨论】:

    • 感谢耶兹瑞尔。同样的问题,我怎样才能摆脱这里每张纸的第一行?
    • skiprows=1 应该有帮助。
    • 太棒了。谢谢大家,但我不得不把这个给最快的一个! :)
    【解决方案3】:

    this question记笔记:

    import pandas as pd
    
    file = pd.ExcelFile('file.xlsx')
    
    names = file.sheet_names  # see all sheet names
    
    df = pd.concat([file.parse(name) for name in names])
    

    结果:

    df
    Out[6]: 
       A  B
    0  1  3
    1  2  4
    0  5  6
    1  7  8
    

    然后你可以运行df.reset_index(),来重置索引。

    编辑:pandas.ExcelFile.parse 是,根据熊猫文档:

    等效于 read_excel(ExcelFile, ...) 有关接受参数的更多信息,请参阅 read_excel 文档字符串

    【讨论】:

    • 谢谢,但为什么使用file.parse 而不是read.excel?
    • 请见上文。
    • 太棒了。谢谢大家,但我不得不把这个给最快的一个! :)
    【解决方案4】:
    file_save_location='myfolder'                                
    file_name='filename'
    
    location = ''myfolder1'
    os.chdir(location)
    files_xls = glob.glob("*.xls*")
    excel_names=[f for f in files_xls]
    sheets = pd.ExcelFile(files_xls[0]).sheet_names
    def combine_excel_to_dfs(excel_names, sheet_name):
        sheet_frames = [pd.read_excel(x, sheet_name=sheet_name) for x in excel_names]
        combined_df = pd.concat(sheet_frames).reset_index(drop=True)
        return combined_df
    
    i = 0
    
    while i < len(sheets):
        process = sheets[i]
        consolidated_file= combine_excel_to_dfs(excel_names, process)
        consolidated_file.to_csv(file_save_location+file_name+'.csv')
        i = i+1
    else:
        "we done on consolidation part"
    

    【讨论】:

    • 如果您可以编辑帖子并添加一些描述和代码会更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多