我有一个包含多个列的数据框(我从pytesseract.image_to_data(img_pl,lang="eng", output_type='data.frame', config='--psm 11')
[使用psm 11或12,结果相同]中获得,并且只从中提取重要的列),让我们看看以下列:
# This is the data I get from the above command,
# I added it like that so you will be able to copy and test it
data = {'left': [154, 154, 200, 154, 201, 199],
'top': [0, 3, 3, 7, 8, 12],
'width': [576, 168, 162, 168, 155, 157],
'height': [89, 10, 10, 10, 10, 10],
'text': ['text1', 'text2', 'text3', 'text4', 'text5', 'text6']}
output_test_min_agg = pd.DataFrame(data)
# Output:
+----+---+-----+------+-------+
|left|top|width|height| text|
+----+---+-----+------+-------+
| 154| 0| 576| 89| text1|
| 154| 3| 168| 10| text2|
| 200| 3| 162| 10| text3|
| 154| 7| 168| 10| text4|
| 201| 8| 155| 10| text5|
| 199| 12| 157| 10| text6|
+----+---+-----+------+-------+
请注意,有些坐标偏离了几个像素(从我看到的最大值3 - 5个像素偏离),这就是为什么宽度也可以考虑在内(例如,"abc"和"abcdef"的左侧将不同,但我们可以看到宽度达到相同的大小
例外结果如下:
+-----+-------+-------+
|index| col 01| col 02|
+-----+-------+-------+
| 0| text1| |
| 1| text2| text3|
| 2| text4| text5|
| 3| | text6|
+-----+-------+-------+
我得到的最好结果是这样的:
output_test_min_agg=output_test_min.sort_values('top', ascending=True)
output_test_min_agg = output_test_min_agg.groupby(['top', 'left'], sort=False)['text'].sum().unstack('left')
output_test_min_agg.reindex(sorted(output_test_min_agg.columns), axis=1).dropna(how='all')
但这仍然不好,因为如果top
或left
有1个像素差,它将为它们创建一个全新的列和行
我怎样才能完成这样的任务呢?
1条答案
按热度按时间ssgvzors1#
我通过以下操作实现了这一点:
我为每个目的做了3个函数
1)使用虚拟数据:
2)使用您提供的代码创建一个函数,并向其中添加
NaN
值的处理3)创建一个函数,根据名称阈值相似度合并列:
4)创建一个函数,根据名称阈值相似性合并行:
最终结果如下:
这是我从虚拟数据中得到的最佳结果,但请注意
text1
是如何获得自己的行和列的,这是因为数据的缘故,如果您仔细查看,会发现它的宽度和高度与其他数据相比都很大,我认为图像中的表有某种非常接近它的标题,pytesseract
将其识别为表的一部分,我给你的建议是尝试一些其他的config
选项或者使用一些深度学习来更好地分类你的表。