Python 查找两个不同长度的数据帧之间的相似性
我有两个熊猫数据帧,都是不同长度的。 DF1大约有120万行(只有一列),DF2大约有300000行(和一列),我正试图从两个列表中找到类似的项目 DF1大约有75%的公司名和25%的人,DF2的情况正好相反,但它们都是字母数字。我想写一个函数,突出显示两个列表中最相似的项目,按分数(或百分比)排序。 比如说,Python 查找两个不同长度的数据帧之间的相似性,python,numpy,pandas,dataframe,scikit-learn,Python,Numpy,Pandas,Dataframe,Scikit Learn,我有两个熊猫数据帧,都是不同长度的。 DF1大约有120万行(只有一列),DF2大约有300000行(和一列),我正试图从两个列表中找到类似的项目 DF1大约有75%的公司名和25%的人,DF2的情况正好相反,但它们都是字母数字。我想写一个函数,突出显示两个列表中最相似的项目,按分数(或百分比)排序。 比如说, Apple -> Apple Inc. (0.95) Apple -> Applebees (0.68) Banana Boat -> Banana Bread (0
Apple -> Apple Inc. (0.95)
Apple -> Applebees (0.68)
Banana Boat -> Banana Bread (0.25)
到目前为止,我尝试了两种方法,但都失败了
方法1:查找两个列表的Jaccard系数
import numpy as np
from sklearn.metrics import jaccard_similarity_score
jaccard_similarity_score(df_1, df_2)
这不起作用,可能是由于两个数据帧的长度不同,我得到以下错误:
ValueError:找到样本数不一致的数组
方法2::使用序列匹配器
from difflib import SequenceMatcher
def similar(a, b):
return SequenceMatcher(None, a, b).ratio()
然后调用数据帧:
similar(df_1, df_2)
这将导致一个错误:
pandas.index.IndexEngine.get_loc中的pandas/index.pyx
(熊猫/索引c:3979)()
pandas.index.IndexEngine.get_loc中的pandas/index.pyx
(熊猫/索引c:3843)()
pandas.hashtable.PyObjectHashTable.get_项中的pandas/hashtable.pyx
(熊猫/哈希表c:12265)()
pandas.hashtable.PyObjectHashTable.get_项中的pandas/hashtable.pyx
(熊猫/哈希表c:12216)()
关键错误:0
如何解决这个问题?解决方案
我必须安装distance
模块,因为在这种情况下,它比弄清楚如何使用jaccard\u similarity\u score
更快。我无法从该函数中重新创建您的数字
安装距离distance
使用距离
head()
用于保护您。我很确定移除它们会炸毁你的电脑,因为它会产生一个1.2Mx0.3M的矩阵
试试这个。我不太确定你到底想要什么。我们可以根据您的清晰度进行调整。解决方案
我必须安装distance
模块,因为在这种情况下,它比弄清楚如何使用jaccard\u similarity\u score
更快。我无法从该函数中重新创建您的数字
安装距离distance
使用距离
head()
用于保护您。我很确定移除它们会炸毁你的电脑,因为它会产生一个1.2Mx0.3M的矩阵
试试这个。我不太确定你到底想要什么。我们可以根据您的清晰度进行调整。或仅限于相同元素位置的项目进行比较
import distance
jd = lambda x, y: 1 - distance.jaccard(x, y)
test_df = pd.concat([df.iloc[:, 0] for df in [df_1, df_2]], axis=1, keys=['one', 'two'])
test_df.apply(lambda x: jd(x[0], x[1]), axis=1)
或仅限于相同元素位置的项目进行比较
import distance
jd = lambda x, y: 1 - distance.jaccard(x, y)
test_df = pd.concat([df.iloc[:, 0] for df in [df_1, df_2]], axis=1, keys=['one', 'two'])
test_df.apply(lambda x: jd(x[0], x[1]), axis=1)
SequenceMatcher
可以匹配字符串,而不是数据帧。您想将df1中的120万与df2中的30万进行比较问题是,您希望最终输出是什么样的?您想为df1的每个元素确定df2中最相似的元素吗?这是一个类似的答案,但与数据帧中的相比,如果您能提供一些示例数据,并描述所需的输出应该是什么,这将非常有帮助。如果您真的想计算两个数据帧中每对行的相似性分数,那么您需要生成一个(300000120000)
数组。假设它包含64位浮点,这个数组将占用大约2.9TB的RAM!我猜你实际上对寻找最近的邻居很感兴趣,在这种情况下,你应该研究一下sklearn.neights
,尤其是,.来自DF1的样本数据:苹果德克萨斯家庭有限责任公司微软爱尔兰研究有限责任公司谷歌汽车有限责任公司John Smith Jane Doe DF2:John Smith Jack Smith Jane Smith苹果公司Applebees Inc John Johnson&Johnson我的期望输出如原始问题所述-相似性分数,以及具有最高匹配的实体,按降序排列。SequenceMatcher
可以匹配字符串,而不是数据帧。要将df1中的120万个实体与df2中的30万个实体进行比较,问题是,您希望最终输出是什么样的?您想为df1的每个元素确定df2中最相似的元素吗?这是一个类似的答案,但与数据帧中的相比,如果您能提供一些示例数据,并描述所需的输出应该是什么,这将非常有帮助。如果您真的想计算两个数据帧中每对行的相似性分数,那么您需要生成一个(300000120000)
数组。假设它包含64位浮点,这个数组将占用大约2.9TB的RAM!我猜你实际上对寻找最近的邻居很感兴趣,在这种情况下,你应该研究一下sklearn.neights
,尤其是,.来自DF1的样本数据:苹果德克萨斯家庭有限责任公司微软爱尔兰研究有限责任公司谷歌汽车有限责任公司John Smith Jane Doe DF2:John Smith Jack Smith Jane Smith苹果公司Applebees Inc John Johnson&Johnson我的期望输出如原始问题所述-相似性分数,以及具有最高匹配的实体,按降序排列。谢谢,我尝试了您的解决方案,这是我得到的输出。考虑到我的数据集只是两个一维列,我不知道如何解释这个结果——有什么想法吗?每个单元格是第一个数据集中第I个元素和第二个数据集中第j个元素之间的距离。如果您只希望为位于相同位置的那些元素计算距离,即距离(数据集1[0],数据集2[0]),那么这就更容易了。我将添加一个答案。谢谢,我尝试了您的解决方案,这是我得到的输出。考虑到我的数据集只是两个一维列,我不知道如何解释这个结果——有什么想法吗?每个单元格是第一个数据集中第I个元素和第二个数据集中第j个元素之间的距离
import distance
jd = lambda x, y: 1 - distance.jaccard(x, y)
test_df = pd.concat([df.iloc[:, 0] for df in [df_1, df_2]], axis=1, keys=['one', 'two'])
test_df.apply(lambda x: jd(x[0], x[1]), axis=1)