Python 如何根据表格标题从包含多个表格的Excel电子表格中选择表格?

Python 如何根据表格标题从包含多个表格的Excel电子表格中选择表格?,python,pandas,dataframe,Python,Pandas,Dataframe,我正在尝试与电子表格交互,我已使用以下方式导入该电子表格: InitialImportedData = pd.read_excel(WorkbookLocation, SheetName) 问题是我从中导入的电子表格包含多个表,我只想使用其中一个表。是否有方法删除特定值之前的所有行和列 我要查找的表有一个标题Premium。我如何得到我想要的表作为一个数据帧,而不是所有的数据帧中分散着大量的NaN数据 有没有一种方法可以在数据帧中定位一个字符串并根据它进行切片?它是唯一一个标记为Premium

我正在尝试与电子表格交互,我已使用以下方式导入该电子表格:

InitialImportedData = pd.read_excel(WorkbookLocation, SheetName)
问题是我从中导入的电子表格包含多个表,我只想使用其中一个表。是否有方法删除特定值之前的所有行和列

我要查找的表有一个标题
Premium
。我如何得到我想要的表作为一个数据帧,而不是所有的数据帧中分散着大量的NaN数据

有没有一种方法可以在数据帧中定位一个字符串并根据它进行切片?它是唯一一个标记为
Premium

编辑

我可以使用以下工具找到表的开始位置:

我用另一种方式解决了这个问题,这可能对那些想要分割数据帧的人有用,因为他们没有通过excel读取数据帧

for x in range (InitialImportedData.shape[1]):
    try :
        list(InitialImportedData.iloc[:,x]).index('Premium')
        print list(InitialImportedData.iloc[:,x]).index('Premium'),x        
    except: 
        pass
通过转换为列表,我可以查看值的位置。我还没有弄清楚如何在最后正确地分割数据

我可以使用:

InitialImportedData.iloc[20:,4:]
要创建一个从角落开始的数据集,我需要(它正好是20,4),但我还没有找到一种方法来切片表的末尾,这样就不会从工作表中引入额外的信息

我在下面提供了一个示例数据集:

    Unnamed: 0 Unnamed: 1    Unnamed: 2    Unnamed: 3    Unnamed: 4  \
0          NaN    Table 1           NaN           NaN           NaN   
1          NaN    Header1       Header2           NaN           NaN   
2          NaN    9.88496       2.29552           NaN           NaN   
3          NaN    7.36861        2.6275           NaN           NaN   
4          NaN    5.34938       8.37391           NaN           NaN   
5          NaN    8.77608       3.70626           NaN           NaN   
6          NaN    7.37828       2.62692           NaN           NaN   
7          NaN    6.82297       9.59347           NaN           NaN   
8          NaN     7.6804       7.38528           NaN           NaN   
9          NaN    2.07633       3.76247           NaN           NaN   
10         NaN        NaN           NaN           NaN           NaN   
11         NaN        NaN           NaN           NaN           NaN   
12         NaN        NaN           NaN           NaN           NaN   
13         NaN        NaN           NaN           NaN           NaN   
14         NaN        NaN           NaN           NaN           NaN   
15         NaN        NaN           NaN           NaN           NaN   
16         NaN        NaN           NaN           NaN           NaN   
17         NaN        NaN           NaN           NaN           NaN   
18         NaN        NaN           NaN           NaN           NaN   
19         NaN        NaN       Premium           NaN           NaN   
20         NaN        NaN  FinalHeader1  FinalHeader2  FinalHeader3   
21         NaN        NaN      0.679507          8.95       5.87512   
22         NaN        NaN       6.22637       6.54385       4.70131   
23         NaN        NaN       8.84881       6.74557       3.31503   
24         NaN        NaN      0.506901       5.36873       2.42905   
25         NaN        NaN       3.91448      0.542635        8.0885   
26         NaN        NaN        5.4045       9.08379       2.35789   
27         NaN        NaN       4.26343       1.37477      0.719881   
28         NaN        NaN       3.03682       9.62835       1.56601   

    Unnamed: 5  Unnamed: 6  Unnamed: 7  Unnamed: 8  Unnamed: 9  
0          NaN         NaN         NaN         NaN         NaN  
1          NaN         NaN         NaN         NaN         NaN  
2          NaN         NaN         NaN         NaN         NaN  
3          NaN         NaN         NaN         NaN         NaN  
4          NaN         NaN         NaN         NaN         NaN  
5          NaN         NaN         NaN         NaN         NaN  
6          NaN     Table 2         NaN         NaN         NaN  
7          NaN  NewHeader1  NewHeader2  NewHeader3  NewHeader4  
8          NaN      1.2035     2.13923     9.59979     4.90745  
9          NaN    0.273928     9.84469     3.62225     1.07671  
10         NaN     3.67524     9.82434    0.366233      7.9009  
11         NaN     2.16405     2.66321     9.08495     8.29695  
12         NaN     6.77611     7.90381     5.13672     3.26688  
13         NaN     1.95482     1.95997     3.40453    0.702198  
14         NaN     6.39919     5.24728     4.16757     6.06336  
15         NaN     2.34901     9.35103     2.72374     7.39052  
16         NaN         NaN         NaN         NaN         NaN  
17         NaN         NaN         NaN         NaN         NaN  
18         NaN         NaN         NaN         NaN         NaN  
19         NaN         NaN         NaN         NaN         NaN  
20         NaN         NaN         NaN         NaN         NaN  
21         NaN         NaN         NaN         NaN         NaN  
22         NaN         NaN         NaN         NaN         NaN  
23         NaN         NaN         NaN         NaN         NaN  
24         NaN         NaN         NaN         NaN         NaN  
25         NaN         NaN         NaN         NaN         NaN  
26         NaN         NaN         NaN         NaN         NaN  
27         NaN         NaN         NaN         NaN         NaN  
28         NaN         NaN         NaN         NaN         NaN  

这是完全可能的。下面是我自己的一些代码,我已经完成了这项工作。Combo1x在工作表“参考”中采用标题“名称”。希望这有帮助

filelog=pd.read_excel(desktop,read_only=True, sheetname=None, na_filter=False)


        combo1= Combobox(frame3, state='readonly')
        combo1x=list(filelog['Reference']['Name'])
编辑:一种只需“Premium”就可以获得所有数字的方法是取max行,并使用while语句反向工作

ash=logbook["Approvals"]
rows = ash.max_row
mylist=[]

while rows != FinalHeader1
    mylist.append()
    rows -= 1

我最终通过编写如下函数来解决问题:

# This function will search for a table within a dataframe, and cut out the section defined with the header specified
# this header must be in the top left, and their must be nothing below or to the right of the table

def CutOutTable(WhereWeAreSearching, WhatWeAreSearchingFor):
    for x in range (WhereWeAreSearching.shape[1]):
        try :
            list(WhereWeAreSearching.iloc[:,x]).index(WhatWeAreSearchingFor)
            WhereToCut = list(WhereWeAreSearching.iloc[:,x]).index(WhatWeAreSearchingFor),x
            SlicedVersionOfWhereWeAreSearching = WhereWeAreSearching.iloc[WhereToCut[0]:,WhereToCut[1]:]
            return SlicedVersionOfWhereWeAreSearching.dropna(axis = 1,how = 'all')
        except:
            pass

它在数据框中查找包含您正在查找的短语的位置,并在其上方和左侧剪切信息,然后删除其右侧包含NaN的列,从而为您提供整个表。如果且仅当您的表格是excel工作表中最右下角的项目。

请澄清多个表格的含义,您是指excel中的“页面”吗?你能分享一下这个DF是什么样子吗?我想答案可能是类似于
index=DF.iloc[DF['some_column'].str.contains('Premium')]
(未经测试,因为我们没有可以使用的示例)。请为我们创建一个可重复的示例。@JulianSilvestri我已经包含了一个类似于数据挖掘类型的示例。@Violatic请检查我的回答。您能否对我创建的GUI的
combo1
frame3
的含义进行一些扩展?@Georgy。如果您只是在分析数据,可以忽略它。当我尝试使用'Name'作为'Premium'和'Reference'作为InitialDataSheetName运行代码时,我得到了KeyError:“Premium”。@Violatic尝试使用FinalHeader1而不是Premium,看看它是否有效。@FanMan然后我得到了:KeyError:“FinalHeader1”我唯一的评论是正式的:Python更喜欢函数的下划线符号,并倾向于缩短名称:例如
剪切表(开始,项目)
?嗨,fralau,我还在学习什么是合适的命名约定?有好的导游吗?我只是尽可能地描述一下,这样就很容易阅读了。您的指南是PEP 8,以下是(您可以在Youtube上找到有关此的视频)。但还有一点:也许有人教你用一种(意思是“迂回的命名方式”)来代替命名?例如,在对话中,你会自然而然地使用哪一个:“BlackHotBeverageWeBuyEveryMorning”或“coffee”?一个清晰、准确的名字可以缩短读者的阅读时间,提高清晰度。