首页 > 解决方案 > 如何删除具有相同列特征值的行以使一行保留已删除行的另一个特征的所有值?

问题描述

我有一组房地产广告数据。有几行是关于相同的房地产,所以它充满了不完全相同的重复。它看起来像这样:

    ID  URL CRAWL_SOURCE    PROPERTY_TYPE   NEW_BUILD   DESCRIPTION IMAGES  SURFACE LAND_SURFACE    BALCONY_SURFACE ... DEALER_NAME DEALER_TYPE CITY_ID CITY    ZIP_CODE    DEPT_CODE   PUBLICATION_START_DATE  PUBLICATION_END_DATE    LAST_CRAWL_DATE LAST_PRICE_DECREASE_DATE
0   22c05930-0eb5-11e7-b53d-bbead8ba43fe    http://www.avendrealouer.fr/location/levallois...   A_VENDRE_A_LOUER    APARTMENT   False   Au rez de chaussée d'un bel immeuble récent,...   ["https://cf-medias.avendrealouer.fr/image/_87...   72.0    NaN NaN ... Lamirand Et Associes    AGENCY  54178039    Levallois-Perret    92300.0 92  2017-03-22T04:07:56.095 NaN 2017-04-21T18:52:35.733 NaN
1   8d092fa0-bb99-11e8-a7c9-852783b5a69d    https://www.bienici.com/annonce/ag440414-16547...   BIEN_ICI    APARTMENT   False   Je vous propose un appartement dans la rue Col...   ["http://photos.ubiflow.net/440414/165474561/p...   48.0    NaN NaN ... Proprietes Privees  MANDATARY   54178039    Levallois-Perret    92300.0 92  2018-09-18T11:04:44.461 NaN 2019-06-06T10:08:10.89  2018-09-25

我想删除太相似而不能重复的行,只保留一个保留和收集CRAWL_SOURCE已删除行的行。例如,假设CRAWL_SOURCE如果描述或大多数图像相似,我想保留一行。到目前为止,我只找到了一种方法来创建一个新列来说明描述何时相同:

df['is_duplicated'] = df.duplicated(['DESCRIPTION'])

或者当图像相同时:

def image_similarity(imageAurls,imageBurls):
    imageAurls = ast.literal_eval(imageAurls)
    imageBurls = ast.literal_eval(imageBurls)
    for urlA in imageAurls:
        responseA = requests.get(urlA)
        imgA = Image.open(BytesIO(responseA.content))
        print(imgA)
        for urlB in imageBurls:
            responseB = requests.get(urlB)
            imgB = Image.open(BytesIO(responseB.content))    
            hash0 = imagehash.average_hash(imgA) 
            hash1 = imagehash.average_hash(imgB) 
            cutoff = 5

            if hash0 - hash1 < cutoff:
                print(urlA)
                print(urlB)
                return('similar')
        return('not similar')

df['NextImage'] = df['IMAGES'][df['IMAGES'].index - 1]
df['IsSimilar'] = df.apply(lambda x: image_similarity(x['IMAGES'], x['NextImage']), axis=1)

因此,如何删除共享相同描述的行,或共享相同照片的行,并制作一个收集CRAWL_SOURCE已删除行的行?

一般来说:如何删除共享同一列特征值的行以使一行收集另一列特征的所有值?

注意:如果您对发现可能相同的房屋有任何其他想法,我将很高兴听到他们的声音。如果以下功能相似,我认为两行可能在谈论相同的房地产:

SURFACE LAND_SURFACE    BALCONY_SURFACE TERRACE_SURFACE ROOM_COUNT  BEDROOM_COUNT   BATHROOM_COUNT  LUNCHROOM_COUNT TOILET_COUNT    FURNISHED   FIREPLACE   AIR_CONDITIONING    GARDEN  SWIMMING_POOL   BALCONY TERRACE CELLAR  PARKING PARKING_COUNT   HEATING_TYPES   HEATING_MODE    FLOOR   FLOOR_COUNT CONSTRUCTION_YEAR   ELEVATOR    CARETAKER   ENERGY_CONSUMPTION  GREENHOUSE_GAS_CONSUMPTION  MARKETING_TYPE  PRICE   PRICE_M2

标签: pythonpython-3.xgroup-bydata-cleaning

解决方案


您正在寻找的是一种记录链接方法,它已经完成了。我建议您使用一个使用单词距离计算和体面文档来检测相似性的库:Python Record Linkage Toolkit。

导入库后,您必须索引要比较的源,如下所示:

indexer = recordlinkage.Index()

#using url as intersection
indexer.block('url')
candidate_links = indexer.index(df_a, df_b)

c = recordlinkage.Compare()

假设您想根据字符串的相似性进行比较,但它们并不完全匹配:

c.string('descriptionA', 'descriptionB', method='jarowinkler', threshold=0.85)

如果你想要一个完全匹配,你应该使用:

c.exact('imageUrl')

无论如何,基于 Record Linkage 的资源(库)更多。


推荐阅读