我正在尝试在其标题列上合并有关电影的两个数据框。 不幸的是,它们不共享索引,顺序不同,并且不包含所有相同的电影。 我已经整理了足够的标题,可以比较它们并确定它们是否可以被视为同一部电影,这是可以接受的。 在进行比较之后,我试图将那些“匹配的”标题设置为彼此相等(从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]

我希望当功能确定它们相似时,用df2的标题覆盖df中的标题。

任何帮助,将不胜感激! 或有关如何更有效地进行此操作的建议。 谢谢!

#1楼 票数:0

您可以通过Fuzzywuzzy的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框中所有标题的最佳匹配标题。

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)

将原始dfmerges数据帧中的标题merges 合并后,覆盖标题。

我希望这有帮助。

  ask by Brandon Lau translate from so

未解决问题?本站智能推荐:

1回复

从另一个数据框中的布尔值设置一个数据框中的值

我有一个 MWE 可以用以下代码重现: 这将创建以下数据帧: 我的问题是,如何根据数据帧B的布尔值更改数据帧A的值? 例如说,如果我想让NAN在数据帧值A那里的实例False的数据帧B ?
2回复

尝试将一个数据框中的值与另一个数据框中的值匹配(python)

我目前有一个数据框 A 由一列 (code1) 的国家代码组成,例如 CA、RU、US 等。我有另一个数据框 B,它有 3 列,其中第一列包含所有可能的国家代码,第二列包含经度值第三个有纬度值。 我正在尝试遍历 A,获取第一列中的第一个国家/地区代码,将其与 B 第一列中的国家/地区代码匹配,然后获
1回复

检查一个数据框值是否与另一个数据框列匹配,然后在数据框列中设置值

我有一个数据框 dfScore 和数据框类别 我想要做的是检查类别中“类别”中的值是否包含在 dfScores 的列中。 如果是,则将 dfScores 列中的值设置为“ScoreTruth”相邻值。 我试过使用 isin 来获取 dfScores 列中的索引,但这实际上并没有告诉我哪个类别是哪个索
1回复

如何基于多列从另一个数据框中减去一个数据框中的值?

我有两个熊猫数据框。 我得到了这两个数据框。 我想要的是创建第三个数据框,在那里我可以保留 id1 和 id2 的每个唯一组合,同时从 df1 中的“总计”中减去 df2 中“Part1”列中的值,因为每个 id1 和 id2 组合仅在任一中出现一次的数据帧。 例如: '625' 和 'AF' 的组
1回复

根据另一个数据框中的信息编辑一个数据框中的值

我有一个名为_df1的数据框,它看起来像这样。 请注意,这不是整个数据框,而是其中的一部分。 _df1: 在完整的数据库中,数据框中有108003行和141个唯一ID。 ID代表特定对象,只要该帧具有该对象,就重复该ID。 换句话说,我的数据有141个不同的对象和1080.03帧。
2回复

如果在另一个数据框中匹配,则更改一个数据框中的值

我创建了 2 个 Pandas DataFrame DataFrame1 图像 DataFrame2 图像 DataFrame1.Number 包含错误的值,但 DataFrame2.Number 包含正确的值。 如果所有列值都匹配,我想将 DataFrame1.Number 的值替换为 Data
1回复

根据另一个数据框中完成的值完成一个数据框中的NaN值

所以,我想要做的是用在第二个数据帧中找到的正确值来完成数据帧的 NaN 值。 它会是这样的 所以,我有这个命令来知道哪些行至少有一个 NaN: 我认为这对使用 for like 函数很有用(在那里没有成功) 然后我尝试了这个: 但它给了我以下错误 ValueError: 您正在尝试合并 objec
3回复

PythonPandas:从另一个数据框更新数据框值

我有这两个数据框:( 更新:我在df1添加了一列stuff以指定两个数据框具有不同的架构) 我想使用基于id列的df2 val列中的值更新df1 val列中的值。 在df1上进行转换后所需的结果: 我可以使用join( merge ),但是随后我需要执行更多步骤才能得到预期的结果(将列