python - 将一列df中的字符串值检查到具有多个条件的另一列df
问题描述
我有两个数据框:
import pandas as pd
first_df = pd.DataFrame({'Full Name': ['Mulligan Nick & Mary', 'Tsang S C', 'Hattie J A C '],
'Address': ['270 Claude Road', '13 Sunnyridge Place', '18A Empire Road']})
second_df = pd.DataFrame({'Owner' : ['David James Mulligan', 'Brenda Joy Mulligan ', 'Helen Kwok Hattie'],
'Add Match': ['19 Dexter Avenue', 'Claude Road ', 'Building NO 512']})
无论如何,仅将列中的第一个字符串与Full Name
列中的最后一个字符串匹配Owner
。
如果有匹配,然后我想比较Address
看看Add match
是否有任何相似的值。如果第一个条件通过但第二个条件失败,则不会将其添加到新数据框中。
使用左连接会导致:
new_df = first_df.merge(second_df, how='left', left_on = ['Full Name', 'Address'], right_on = ['Owner', 'Add Match'])
print(new_df.head())
Full Name Address Owner Add Match
0 Mulligan Nick & Mary 270 Claude Road NaN NaN
1 Tsang S C 13 Sunnyridge Place NaN NaN
2 Hattie J A C 18A Empire Road NaN NaN
然而,想要的输出看起来更像这样:
new_df
Name Address
---- --------
Brenda Joy Mulligan Claude Road
解决方案
您可以利用difflib
Python 标准库中的模块来查找不同列之间的相似之处。例如,您可以定义以下函数:
from difflib import SequenceMatcher
def compare_df(left, right, col: str):
left[f"{col}_match_ratio"] = 0
for value in left[col]:
best_ratio = 0
for other in right[col]:
result = SequenceMatcher(None, str(value), str(other)).ratio()
if result > best_ratio:
best_ratio = result
left.loc[left[col] == value, f"{col}_match_ratio"] = round(best_ratio, 2)
然后:
- 您只需确保要比较的列在两个 dfs 中具有相同的名称
- 您调用 df_compare(first_df, second_df, "Owner") 将“Owner_match_ratio”列添加到 second_df
- 最后,您按照所需的最小匹配率(例如 70 %)过滤第二个 df,如下所示:
new_df = second_df.loc[second_df["Owner_match_ratio"] > 0.7, :]
推荐阅读
- ansible - Ansible剧本缩进问题
- javascript - 在UseEffect下使用多个设置状态的api调用和一个依赖,如何防止子组件的额外重新渲染?
- css - 如何将复选框的背景颜色更改为黑色?
- mysql - ERROR 1066 (42000): 不是唯一的表/别名
- airflow - DagBag 没有按预期填充 dag
- oracle-apex - 如何在主题 apex oracle 21 中更改字体
- python - 具有axis = 0意外行为的熊猫apply()
- c# - 使用栈的二叉搜索树
- elasticsearch - 将 azure 活动目录与 NEST/Elasticsearch.net 一起使用
- java - 为什么静态变量返回空,即使我已经在其他类中设置它?