我有一个Excel表格,看起来像下面这样。
我希望能够在我的Python脚本中将每个表提取到一个pandas框架中(例如df 1 = table_header,df 2 = table_header_2)。这个问题已经在here和这里处理过了。第一个答案隐藏在付费墙后面。第二,我相信@Rotem提供了一个非常有说服力的解决方案,但是在应用它时,我遇到了检测第一个表的开始和索引的问题。我也许能在一点帮助下解决这些问题,但还有另一个想法我想探索。
如果我知道表格标题的名称,并且可以预期它们存在于每个表格中,并且我知道我可以使用openpyxl找到它们的索引,那么我可以执行某种边缘检测吗?类似于我提供的第二个链接中@Rotem使用的边缘检测,以提取附加到表格标题的所有单元格?还有比遍历行/列并检测非None值数量的变化更简单的方法吗?需要注意的是,即使我知道表头的名称,我也不一定知道这些表头的索引,因为表的大小可能会改变。This solution似乎做了一些非常沿着这些线,但我不明白是如何提取所有的单元格从相关的和附加的表。我发现自己对这件事有点无能为力。
提前感谢您的建议。
2条答案
按热度按时间cygmwpex1#
-#此答案如果数据是不包含在'Excel表格' #-
我将添加这个作为第二个答案,所以任何关于它的评论都不会添加到另一个答案的长线索中。
如果数据不包含在表格中,则有必要找到“左上角单元格”(tlc)和“右下角单元格”(brc)。
在这个例子中,使用相同的数据,代码查找“header”名称。我使用“table header 1”和“table header 2”作为这两个部分的分界(我更改了单元格“A1”“table header 1”“中的名称)。标题被添加到列表
section_headers
中,该列表包含工作表中使用的所有标题名称。1.给定示例中的两个数据集,它们的TLC都在A列中,我只搜索该列。如果这不是你的实际工作表的情况,那么你可能需要包括其他列,如果它特定的列只有薄层色谱或整个使用范围,如果他们可能出现在任何地方。
1.代码检查列A中每个单元格的值,直到找到从A1到最后使用的行。如果它发现一个值与列表“section_headers”中的一个标题相匹配,那么它将尝试通过从一行向下检查每个单元格来查找该部分的范围,然后跨列检查,直到它是一个空单元格(即,包含值Python None)。然后再往下一行做同样的动作。
1.一旦它得到最后一列和行(即,BRC),然后它使用与前面相同的函数来转换为DF。
这段代码确定了标题下第一个单元格的最后一列和最后一行(因此在“table header 1”中,这是单元格“A2”)。因此,假设数据在行和列中是均匀的,并且与从该单元格测量的数据相匹配。
此代码的输出
mm9b1k5b2#
-#这个答案,如果数据包含在“Excel表格”#-
您可以使用Openpyxl获取表信息(坐标或范围),并使用一个通用方法将该范围读入DataFrame。
为了更清楚,我将示例tables更改为具有唯一值和头。
这将给予一个输出;