Установить значения Dataframe для значений в другом Dataframe - PullRequest
0 голосов
/ 18 сентября 2019

Я пытаюсь объединить два кадра данных о фильмах в заголовках столбцов.К сожалению, у них нет общих индексов, они упорядочены по-разному и не содержат одинаковых фильмов.Я очистил названия достаточно, чтобы я мог сравнить их и определить, являются ли они приемлемо похожими, чтобы называться одним и тем же фильмом.После этого сравнения я пытаюсь установить эти «совпадающие» заголовки равными eachother (беря заголовок из df2 и перезаписывая его эквивалент в df), но я не могу заставить его работать.

Этоdf.head (10)

      Unnamed: 0                                       title    imdb_id  \
72            72                                   Gully Boy  tt2395469   
767          767                                   Long Shot  tt2139881   
1000        1000                                      Little  tt8085790   
1285        1285                                       Dumbo  tt3861390   
1342        1342                           Don"t Stop Me Now  tt9260446   
1358        1358  How to Train Your Dragon: The Hidden World  tt2386490   
1621        1621                               Captive State  tt5968394   
1658        1658                   Spider-Man: Far from Home  tt6320628   
1944        1944                           Avengers: Endgame  tt4154796   
1946        1946                              Captain Marvel  tt4154664   

Это df2.head (10)

      Unnamed: 0  bo_year_rank                                      title  \
7455           0             1                           Avengers Endgame   
7456           1             2                              The Lion King   
7457           2             3                            Captain Marvel    
7458           3             4                   Spider-Man Far from Home   
7459           4             5                                Toy Story 4   
7460           5             6                                    Aladdin   
7461           6             7         Fast  Furious Presents Hobbs  Shaw   
7462           7             8                        The Wandering Earth   
7463           8             9                                     Ne Zha   
7464           9            10  How to Train Your Dragon The Hidden World   

Функция сравнения, которую я использую:


def fix_stupid_titles(title, list_titles, min_score=0):
    # -1 score incase we don't get any matches
    max_score = -1
    # Returning empty name for no match as well
    max_title = ""
    # Iterating over all names in the other
    for title2 in list_titles:
        #Finding fuzzy match score
        score = fuzz.ratio(title, title2)
        # Checking if we are above our threshold and have a better score
        if (score > min_score) & (score > max_score):
            max_title = title2
            max_score = score

    return (title, max_title, max_score)

Моя мысльсостоит в том, чтобы перебрать один кадр данных и применить функцию stupid_titles для проверки сходства, но тогда я не уверен, как обновить заголовки, чтобы они были равны.

for i, title in enumerate(df.title):
    thing=fix_stupid_titles(title, df2.title, min_score=75)
    #thing saves the return of the functoin (title, max_title, score)
    df['title'][thing[1]]=thing[0]

Я хочу, чтобы заголовки в dfперезаписывайте заголовки из df2, когда функция определяет, что они похожи.

Любая помощь будет принята с благодарностью!Или предложения о том, как сделать это более эффективно.Спасибо!

1 Ответ

0 голосов
/ 19 сентября 2019

Вы можете просто достичь этого с помощью process нечеткого текста.

df_choices = df['title'].values

Это позволит получить список заголовков с вашего df кадра данных

def fuzzratio(row, options):
    match, score = process.extractOne(row['title'], options, scorer=fuzz.ratio)
    row['matches'] = match
    row['score'] = score
    return row

matches = df2.apply(lambda x: fuzzratio(x, df_choices), axis=1)
matches.columns = ['title', 'matches', 'score']

Функция fuzzratio используется для получения наилучшего соответствия заголовка для всех заголовков в df2 Dataframe.

merges = df2.merge(matches, on='title', how = 'inner')
merges = merges.loc[merges['score'] >= 90]
merges.drop('score', axis=1, inplace=True)
merges.columns = ['new_title', 'title']

Отфильтруйте все заголовки, которые набрали более 75 баллов.

df = df.merge(merges, on='title', how = 'left')
df.loc[~df['new_title'].isna(), 'title'] = df['new_title']
df.drop('new_title', axis=1, inplace=True)

Объединение исходного df с заголовками из merges кадра данных.После слияния перезаписать заголовки.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...