Объединить, если один столбец содержится в другом столбце в Python - PullRequest
0 голосов
/ 14 февраля 2020

Я хотел бы объединить df2 в df1, если title из df1 содержит китайские символы в proj из df2.

df1:

    id            title        price
0    1       大芬村茂业城花园大厦   1436584.80
1    2         旭景佳园二期A栋   3277218.34
2    3           阳光天地家园   3704190.14
3    4   创业路北南海城中心A栋12房   9730423.34
4    5               满园   4696509.11
5    6     天健世纪花园A栋1号房产  13307647.60
6    7          桃源盛景园A栋   3347066.45
7    8     南园路西侧金海岸大厦C座   1993030.20
8    9       华新村西区D栋78房   4143736.08
9   10   坂田村天景山庄西区S栋23房   1054589.74
10  11  东门中路旺业豪苑旺业阁123房   1460930.52

df2:

       proj_id    proj
0   2810171299     茂业城
1   2810004754    吉信大厦
2   2810648028    绿景花园
3   2810004576    鸿翔花园
4   2810070218      佳园
5   2810604862   南海城中心
6   2810004512   融湖中心城
7   2810062622  天健世纪花园
8   2810023458    天景山庄
9   2810635990    旺业豪苑
10  2810286990     金海岸
11  2810068683     华新村

Я пробовал с кодом из здесь с нечетким соответствием метод, он работает как-то, но если title имеет очень длинные символы, некоторые proj не будут сопоставлены. Поэтому мне интересно, есть ли другой метод для точного соответствия.

def fuzzy_merge(df_1, df_2, key1, key2, threshold=90, limit=5):
    s = df_2[key2].tolist()

    m = df_1[key1].apply(lambda x: process.extract(x, s, limit=limit))
    df_1['matches'] = m

    m2 = df_1['matches'].apply(lambda x: ', '.join([i[0] for i in x if i[1] >= threshold]))
    df_1['matches'] = m2

    return df_1
df = fuzzy_merge(df1, df2, 'title', 'proj', threshold = 90)
print(df)

Затем объедините df и df2, он странным образом генерирует столбец key_0:

data = pd.merge(df, df2, left_on=df['matches'], right_on=df2['proj'], how ='left')
print(data)

Ouput:

     key_0  id            title        price matches       proj_id    proj
0      茂业城   1       大芬村茂业城花园大厦   1436584.80     茂业城  2.810171e+09     茂业城
1       佳园   2         旭景佳园二期A栋   3277218.34      佳园  2.810070e+09      佳园
2            3           阳光天地家园   3704190.14                   NaN     NaN
3    南海城中心   4   创业路北南海城中心A栋12房   9730423.34   南海城中心  2.810605e+09   南海城中心
4            5               满园   4696509.11                   NaN     NaN
5   天健世纪花园   6     天健世纪花园A栋1号房产  13307647.60  天健世纪花园  2.810063e+09  天健世纪花园
6            7          桃源盛景园A栋   3347066.45                   NaN     NaN
7      金海岸   8     南园路西侧金海岸大厦C座   1993030.20     金海岸  2.810287e+09     金海岸
8      华新村   9       华新村西区D栋78房   4143736.08     华新村  2.810069e+09     华新村
9     天景山庄  10   坂田村天景山庄西区S栋23房   1054589.74    天景山庄  2.810023e+09    天景山庄
10    旺业豪苑  11  东门中路旺业豪苑旺业阁123房   1460930.52    旺业豪苑  2.810636e+09    旺业豪苑

Ожидаемый вывод будет выглядеть так:

    id            title        price    proj
0    1       大芬村茂业城花园大厦   1436584.80     茂业城
1    2         旭景佳园二期A栋   3277218.34      佳园
2    3           阳光天地家园   3704190.14     NaN
3    4   创业路北南海城中心A栋12房   9730423.34   南海城中心
4    5               满园   4696509.11     NaN
5    6     天健世纪花园A栋1号房产  13307647.60  天健世纪花园
6    7          桃源盛景园A栋   3347066.45     NaN
7    8     南园路西侧金海岸大厦C座   1993030.20     金海岸
8    9       华新村西区D栋78房   4143736.08     华新村
9   10   坂田村天景山庄西区S栋23房   1054589.74    天景山庄
10  11  东门中路旺业豪苑旺业阁123房   1460930.52    旺业豪苑

Как я могу улучшить код или попробовать другой метод? Спасибо за вашу помощь.

...