【问题标题】:Pandas: How can I iterate a for loop over 2 different data-frames?Pandas:如何在 2 个不同的数据帧上迭代一个 for 循环?
【发布时间】:2018-03-26 00:56:30
【问题描述】:

我正在尝试计算 2 个数据帧中多行的模糊率:

df1:

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

df2:

name_2
abcde
xyz

我想计算 df1.name 和 df2.name_2 中所有值之间的模糊率:

为此,我有代码:

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

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

final_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

感谢您的帮助!

【问题讨论】:

  • 您可以尝试这样的操作:for i, r in zip(df1['name'], df2['name_2']): ... 这仅适用于您想要的两个数据帧长度相同的情况,但应该适用于您的示例。
  • 谢谢!但是我的第二个数据框只有 2 行,而第一个数据框有 3 行。
  • @L.MacKenzie 另外我还想要第一个数据帧中的 id。感谢您的帮助!

标签: python pandas for-loop fuzzywuzzy


【解决方案1】:

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

创建一个空的DataFrame:

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

遍历插入 id、name 和 score 的两个 DataFrame,并将其连接到最终的 DataFrame:

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】:

    我对lambda函数在pd.apply中的应用不是很了解,但是经过一番SO搜索,我认为这是一个合理的解决方案。

    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']})
    

    这是 pandas 中的交叉连接;需要 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.ratiodf 中的列。 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 之外。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-04
      • 2019-11-10
      • 2016-05-08
      • 1970-01-01
      • 2017-08-31
      • 1970-01-01
      • 2022-01-15
      • 2020-11-17
      相关资源
      最近更新 更多