代码之家  ›  专栏  ›  技术社区  ›  Sravee

熊猫:我如何在两个不同的数据帧上迭代for循环?

  •  1
  • Sravee  · 技术社区  · 7 年前

    df1:

    id    name
    1     Ab Cd E
    2     X.Y!Z
    3     fgh I
    

    df2:

    name_2
    abcde
    xyz
    

    我想计算df1中所有值之间的模糊比。名称和df2。名称2:

    为此,我有代码:

    for i in df1['name']:
        for r in df2['name_2']:
            print(fuzz.ratio(i,r))
    

    但我希望最终结果也有来自df1的ID。理想情况下会是这样:

    最终df:

    id      name        name_2    score
    1      Ab Cd E      abcde      50
    1      Ab Cd E       xyz        0
    2       X.Y!Z       abcde       0
    2       X.Y!Z        xyz       60
    3       fgh I       abcde       0
    3       fgh I        xyz        0
    

    谢谢你的帮助!

    2 回复  |  直到 7 年前
        1
  •  1
  •   L. MacKenzie    7 年前

    你可以这样解决你的问题:

    final = pandas.DataFrame({'id': [], 'name': [], 'name_2': [], 'score': []})
    

    迭代两个数据帧,插入id、名称和分数,并将其连接到最终数据帧:

    for id, name in zip(df1['id'], df1['name']):
        for name2 in df2['name_2']:
            tmp = pandas.DateFrame({'id': id, 'name': name, 'name_2': name2, 'score': fuzz.ratio(name, name2)})
        final = pandas.concat([final, tmp], ignore_index=True)
    
    print(final)
    

        2
  •  0
  •   Evan    7 年前

    我不完全理解lambda函数在中的应用 pd.apply ,但经过一些探索,我认为这是一个合理的解决方案。

    import pandas as pd
    from fuzzywuzzy import fuzz
    
    d = [{'id': 1, 'name': 'Ab Cd e'}, {'id': 2, 'name': 'X.Y!Z'}, {'id': 3, 'name': 'fgh I'}] 
    df1 = pd.DataFrame(d)
    df2 = pd.DataFrame({'name_2': ['abcde', 'xyz']})
    

    这是熊猫的交叉连接;需要tmp df pandas cross join no columns in common

    df1['tmp'] = 1
    df2['tmp'] = 1
    
    df = pd.merge(df1, df2, on=['tmp'])
    df = df.drop('tmp', axis=1)
    

    你可以 .apply 函数 fuzz.ratio 到中的列 df . Pandas: How to use apply function to multiple columns

    df['fuzz_ratio'] = df.apply(lambda row: fuzz.ratio(row['name'], row['name_2']), axis = 1)
    
    df
    

    我还尝试在上设置索引 df1 ,但这导致其被排除在交叉连接的df之外。