将Pandas用于pd.read_excel()以获取同一工作簿的多个工作表

时间:2014-10-23 04:21:45

标签: python excel pandas dataframe

我有一个大型电子表格文件(.xlsx),我正在使用python pandas进行处理。碰巧我需要来自该大文件中两个选项卡的数据。其中一个标签有大量数据,另一个只有几个方格单元。

当我在任何工作表上使用pd.read_excel()时,它会在整个文件中加载(不仅仅是我感兴趣的工作表)。因此,当我使用该方法两次(每张纸一次)时,我实际上必须使整个工作簿被读取两次(即使我们只使用指定的工作表)。

我使用它是错误的还是仅限于这种方式?

谢谢!

11 个答案:

答案 0 :(得分:121)

尝试pd.ExcelFile

xls = pd.ExcelFile('path_to_file.xls')
df1 = pd.read_excel(xls, 'Sheet1')
df2 = pd.read_excel(xls, 'Sheet2')

如@HaPsantran所述,在ExcelFile()电话会议期间会读入整个Excel文件(似乎没有办法解决此问题)。这样,您只需每次要访问新工作表时都不必阅读相同的文件。

请注意,sheet_name的{​​{1}}参数可以是工作表的名称(如上所示),一个指定工作表编号的整数(例如0,1等),工作表名称列表或指数,或pd.read_excel()。如果提供了列表,则返回一个字典,其中键是表名/索引,值是数据帧。默认设置是简单地返回第一张表(即None)。

如果指定了sheet_name=0,则会返回所有工作表作为None字典。

答案 1 :(得分:54)

有3种选择:

  1. 直接将第一张表读入数据框
  2. 阅读excel文件并获取工作表列表。然后选择并加载表格。
  3. 阅读所有表格并将其存储在字典中。
  4. 代码示例:

    import pandas as pd
    
    df = pd.read_excel('excel_file_path.xls')
    # this will read the first sheet into df
    
    xls = pd.ExcelFile('excel_file_path.xls')
    
    # Now you can list all sheets in the file
    xls.sheet_names
    # ['house', 'house_extra', ...]
    
    # to read just one sheet to dataframe:
    df = pd.read_excel(file_name, sheetname="house")
    
    # to read all sheets to a map
    sheet_to_df_map = {}
    for sheet_name in xls.sheet_names:
        sheet_to_df_map[sheet_name] = xls.parse(sheet_name)
    

    更新

    # @ihightower pointed out in the comments that all sheets can be 
    # directly read into an ordered dictionary in 1 step
    
    # for pandas version >= 0.21.0
    sheet_to_df_map = pd.read_excel(file_name, sheet_name=None)
    
    # for pandas version < 0.21.0
    sheet_to_df_map = pd.read_excel(file_name, sheetname=None)
    

    更新2:感谢@toto_tico将其指出。

      

    sheetname:string,int,字符串/整数的混合列表,或无,默认为0   从版本0.21.0开始不推荐使用:使用sheet_name而不是Source Link

答案 2 :(得分:25)

您还可以使用工作表的索引:

xls = pd.ExcelFile('path_to_file.xls')
sheet1 = xls.parse(0)

将提供第一张工作表。第二个工作表:

sheet2 = xls.parse(1)

答案 3 :(得分:19)

您还可以将工作表名称指定为参数:

data_file = pd.read_excel('path_to_file.xls', sheetname="sheet_name")

将仅上传工作表“sheet_name”

答案 4 :(得分:5)

pd.read_excel('filename.xlsx') 

默认情况下,请阅读工作簿的第一张纸。

pd.read_excel('filename.xlsx', sheet_name = 'sheetname') 

阅读特定的工作表并

pd.read_excel('filename.xlsx', sheet_name = None) 

从Excel到pandas数据框读取所有工作表,因为OrderedDict的类型表示嵌套数据框,所有工作表都作为在数据框内部收集的数据框,其类型为OrderedDict。

答案 5 :(得分:4)

如果您有兴趣阅读所有图纸并将它们合并在一起。最好,最快的方法

sheet_to_df_map = pd.read_excel('path_to_file.xls', sheet_name=None)
mdf = pd.concat(sheet_to_df_map, axis=0, ignore_index=True)

这会将所有工作表转换为单个数据帧m_df

答案 6 :(得分:1)

很遗憾,它将始终加载完整文件。如果您重复执行此操作,则最好将工作表提取为单独的CSV,然后分别加载。您可以使用d6tstack自动执行该过程,该过程还添加了其他功能,例如检查所有工作表或多个Excel文件中的所有列是否相等。

import d6tstack
c = d6tstack.convert_xls.XLStoCSVMultiSheet('multisheet.xlsx')
c.convert_all() # ['multisheet-Sheet1.csv','multisheet-Sheet2.csv']

请参见d6tstack Excel examples

答案 7 :(得分:1)

如果您已将excel文件与python程序(相对路径)保存在同一文件夹中,则只需提及工作表编号以及文件名。

示例:

 data = pd.read_excel("wt_vs_ht.xlsx", "Sheet2")
 print(data)
 x = data.Height
 y = data.Weight
 plt.plot(x,y,'x')
 plt.show()

答案 8 :(得分:1)

如果:

  • 您需要多个但不是全部工作表,并且
  • 您想要一个df作为输出

然后,您可以传递工作表名称列表。您可以手动填充:

import pandas as pd
    
path = "C:\\Path\\To\\Your\\Data\\"
file = "data.xlsx"
sheet_lst_wanted = ["01_SomeName","05_SomeName","12_SomeName"] # tab names from Excel

### import and compile data ###
    
# read all sheets from list into an ordered dictionary    
dict_temp = pd.read_excel(path+file, sheet_name= sheet_lst_wanted)

# concatenate the ordered dict items into a dataframe
df = pd.concat(dict_temp, axis=0, ignore_index=True)

OR

如果您所需的工作表具有通用的命名约定,也可以使您与不需要的工作表区分开,则可以实现一点自动化:

# substitute following block for the sheet_lst_wanted line in above block

import xlrd

# string common to only worksheets you want
str_like = "SomeName" 
    
### create list of sheet names in Excel file ###
xls = xlrd.open_workbook(path+file, on_demand=True)
sheet_lst = xls.sheet_names()
    
### create list of sheets meeting criteria  ###
sheet_lst_wanted = []
    
for s in sheet_lst:
    # note: following conditional statement based on my sheets ending with the string defined in sheet_like
    if s[-len(str_like):] == str_like:
        sheet_lst_wanted.append(s)
    else:
        pass

答案 9 :(得分:1)

选项1

如果不知道工作表名称

# Read all sheets in your File
df = pd.read_excel('FILENAME.xlsm', sheet_name=None)
    
# Prints all the sheets name in an ordered dictionary
print(df.keys())

然后,根据一个人想要阅读的图纸,可以将它们各自传递给特定的dataframe,例如

sheet1_df = pd.read_excel('FILENAME.xlsm', sheet_name=SHEET1NAME)
sheet2_df = pd.read_excel('FILENAME.xlsm', sheet_name=SHEET2NAME)

选项2

如果名称不相关且唯一在乎的是工作表的位置。假设有人只想要第一张纸,

# Read all sheets in your File
df = pd.read_excel('FILENAME.xlsm', sheet_name=None)

sheet1 = list(df.keys())[0]

然后,根据工作表名称,可以将其分别传递给特定的dataframe,例如

sheet1_df = pd.read_excel('FILENAME.xlsm', sheet_name=SHEET1NAME)

答案 10 :(得分:0)

OrderDetail.objects.filter(startDate_gte=your_date, endDate__lte=your_date).exists()

这将从文件 df = pd.read_excel('FileName.xlsx', 'SheetName') 中读取工作表 SheetName