繁体   English   中英

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

[英]Pandas: How can I iterate a for loop over 2 different data-frames?

我正在尝试计算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

谢谢您的帮助!

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

创建一个空的DataFrame:

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

遍历两个DataFrame,插入ID,名称和得分,并将其串联到最终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)

可能有一种更清洁,更有效的方法来执行此操作,但是我希望这会有所帮助。

我不完全了解pd.apply中lambda函数的应用,但是经过一些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']})

这是熊猫的交集。 要求tmp df 大熊猫交叉连接没有共同点

df1['tmp'] = 1
df2['tmp'] = 1

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

您可以将.apply函数fuzz.ratio df列。 熊猫:如何使用套用功能至多栏

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

df

我还尝试在df1上设置索引,但这导致将其从交叉联接的df中排除。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM