如何检查2列之间的字符匹配?

时间:2019-04-02 09:26:22

标签: python sql pandas

我有两列,并且我想检查它们是否匹配4个或更多字符,而不管数组的位置如何,如果它们匹配,则创建一列,如果匹配则确定,否则匹配KO。

如何在PYTHON或SQL LITE中做到这一点?

示例:

DATASET WITH;

Street 1;Street 2
ASENSIO Y TOLEDO 15;AVILA 9
AVILA 9;AVILA 9
FISTERRA S/N;FINISTERRE S/N - SAN ROQUE
PASEO DEL PUER;PASEO DEL PUERTO SN
PASEO DEL PUER;PASEO DEL PUERTO SN
LA UNION 2;LA UNION 2
ALEGRIA 14;LA UNION 2

谢谢。

6.9.1 Function definitions, paragraph 10 of the C standard

代码:

def dataet():
df_dataset= pd.read_csv("C:/Users/Documents/DATASET2.CSV", sep=';')

print(df_dataset.columns.values)
query = """
        SELECT INSTR(street 1, street 2)
        FROM df_dataset
    """

result= pdsql.sqldf(query)
print(result)

2 个答案:

答案 0 :(得分:1)

在python中,您可以使用set来获取字符串中的唯一字符,然后使用&Street 1中的Street 2集来获得它们的并集。我还要从匹配列表中删除空格,您不想计算空格,对吧?

df['count'] = ['OK' if len(set(x) & set(y) - set(' ')) >= 4 else 'KO' for x, y in zip(df['Street 1'].fillna(''), df['Street 2'].fillna(''))]

print(df)

输出:

              Street 1                    Street 2 count
0  ASENSIO Y TOLEDO 15                     AVILA 9    KO
1              AVILA 9                     AVILA 9    OK
2         FISTERRA S/N  FINISTERRE S/N - SAN ROQUE    OK
3       PASEO DEL PUER         PASEO DEL PUERTO SN    OK
4       PASEO DEL PUER         PASEO DEL PUERTO SN    OK
5           LA UNION 2                  LA UNION 2    OK
6           ALEGRIA 14                  LA UNION 2    KO

更新:如果要查找Street 1Street 2之间的最长公共子字符串的长度:

from difflib import SequenceMatcher

z = df.fillna('')
z['count'] = [len(x[m.a:m.a+m.size].replace(' ', '')) for x, m in
     [(x, SequenceMatcher(None, x, y).find_longest_match(0, len(x), 0, len(y)))
     for x, y in zip(z['Street 1'], z['Street 2'])]]

z['match'] = ['OK' if x >= 4 else 'KO' for x in z['count']]

print(z)

输出:

              Street 1                    Street 2  count match
0  ASENSIO Y TOLEDO 15                     AVILA 9      1    KO
1              AVILA 9                     AVILA 9      6    OK
2         FISTERRA S/N  FINISTERRE S/N - SAN ROQUE      6    OK
3       PASEO DEL PUER         PASEO DEL PUERTO SN     12    OK
4       PASEO DEL PUER         PASEO DEL PUERTO SN     12    OK
5           LA UNION 2                  LA UNION 2      8    OK
6           ALEGRIA 14                  LA UNION 2      1    KO
7     JARILLO 7 BO IZD                SAN AMBROSIO      1    KO
8     STREET AVE PARRA              PARRA STREET 4      6    OK
9              PARRA 4                                  0    KO

答案 1 :(得分:0)

还使用numpy.where():

df['res'] = np.where([len(set(x) - set(y))>=4 for x, y in zip(df['Street 1'], df['Street 2'])], 'OK', 'KO')