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”?一个清晰、准确的名字可以缩短读者的阅读时间,提高清晰度。