如何比较熊猫(python 3.x)中两个数据帧中的字符串?

时间:2019-04-09 08:53:10

标签: python-3.x pandas

我有两个这样的DF:

df1:
ProjectCode        ProjectName
1                     project1
2                     project2
3                     projc3
4                     prj4
5                     prjct5

和df2 as

VillageName
v1
proj3
pro1
prjc3
project1

我要做的是将每个ProjectNameVillageName进行比较,并添加匹配百分比。要计算的百分比为:

No. of matching characters/total characters * 100

乡村数据(即df2)具有超过1000万条记录,而项目数据(即df1)包含约1200条记录。

到目前为止我所做的:

import pandas as pd
df1 = pd.read_excel("C:\\Users\\Desktop\\distinctVillage.xlsx")
df = pd.read_excel("C:\\Users\\Desktop\\awcProjectMaster.xlsx")
for idx, row in df.iteritems():
    for idx1, row1 in df1.iteritems():

我不知道该如何进行。如何找到子字符串并获取与每个字符串百分比匹配的第三个df。我认为这是不可行的,因为Project中的每个记录都将与Village的每个值进行匹配,从而产生巨大的结果。

是否有更好的方法来找出哪些项目名称与哪些村庄名称匹配,以及匹配程度如何?

预期输出:

ProjectName     VillageName      charactersMatching      PercentageMatch
project1         v1                   1                       whateverPercent
project1         proj3                4                        whateverPercent

可以根据可行性和解决方案更改期望的输出。

1 个答案:

答案 0 :(得分:1)

以下代码假定您不关心重复的字符(因为它采用了两侧的字符集)。

percentage_match = df1['ProjectName'].apply(lambda x: df2['VillageName'].apply(lambda y: len(set(y).intersection(set(x))) / len(set(x+y))))

输出:

                    0         1         2         3         4
ProjectCode                                                  
1            0.111111  0.444444  0.500000  0.444444  1.000000
2            0.000000  0.444444  0.333333  0.444444  0.777778
3            0.000000  0.833333  0.428571  0.833333  0.555556
4            0.000000  0.500000  0.333333  0.500000  0.333333
5            0.000000  0.375000  0.250000  0.571429  0.555556

如果您希望每个项目的“最佳匹配”:

percentage_match.idxmax(axis = 1)

输出:

1    4
2    4
3    1
4    1
5    3