问题描述
我是Pandas和Python Record Linkage Toolkit的新手,所以如果答案很明显,请原谅我。我正在尝试将一个大型数据集“ CSV_1”与另一个“ CSV_2”进行交叉引用,以创建仅由匹配项组成的第三个CSV文件,该匹配项将CSV_1和CSV_2的所有列连接在一起,而不管它们是否重叠,以保留原始记录,例如
CSV_1 CSV_2
Name City Date Name_of_thing City_of_Origin Time
Examp. Bton 7/11 THE EXAMPLE,LLC Bton,USA 7/11/2020 00:00
Nomatch Cton 10/10 huh,inc. Lton,AMERICA 9/8/2020 00:00
将输出
CSV_3
Name City Date Name_of_thing City_of_Origin Time
Examp. Bton 7/11 THE EXAMPLE,USA 7/11/2020 00:00
数据结构不好,并且CSV_2的列比CSV_1的要多,这就是为什么我一直尝试基于名称列以city列作为索引块来查找模糊匹配。在使匹配阶段无法执行时遇到麻烦,没关系高效地进行处理,甚至没有解决串联步骤。对如何解决这个问题有帮助吗?
编辑:文件每个都非常大(均为100万行,每行8-20列,每行80-200mb),即使用熊猫加载单列也很麻烦。就上下文而言,这是一个用于作业应用程序的数据项目,它表示对“通过Python或R的熟悉程度”的偏爱。通常情况下,此标题不需要任何编码知识,这就是为什么我发现它如此奇怪,因此公司决定分配此复杂数据问题。参数为:在较低内存(例如2013 Dell Inspiron)环境中本地运行的单个Python文件,无需修改(即,不增加页面文件大小)。
解决方法
对于您的问题陈述,并考虑涉及的数据大小,建议将数据加载到数据库中。然后,我将使用以下SQL解决您的问题,然后将结果读入本地python env / pandas数据框:
select *
from csv_1
inner join csv_2
on csv_1.city = csv_2.city_of_origin
where STRPOS( lower(csv_1.name),lower(csv_2.name_of_thing) )>0
or STRPOS( lower(csv_2.name_of_thing),lower(csv_1.name) )>0