Pandas: 如何在 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、names 和 score,并将其连接到最终的 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)
可能有更简洁、更有效的方法来执行此操作,但我希望这对您有所帮助。
我不是很了解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
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 之外。
我正在尝试计算 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、names 和 score,并将其连接到最终的 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)
可能有更简洁、更有效的方法来执行此操作,但我希望这对您有所帮助。
我不是很了解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
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 之外。