我有两个数据帧:
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
您可以利用Python标准库中的
difflib
模块来查找不同列之间的相似性。 例如,您可以定义以下函数:然后:
new_df = second_df.loc[second_df["Owner_match_ratio"] > 0.7, :]
受此启发,您可以采用类似的解决方案
TL;博士
一步一步
最初,提取所需的姓氏键
PS:根据您的指示,我们使用pandas/numpy组合中的内置字符串方法。但是如果它更适合您,您也可以为地址部分应用下面所示的相似性方法(例如
difflib.get_close_matches
)接下来,执行这些数据帧的内部联接以匹配
last_name
键然后应用具有所需相似性的
difflib.get_close_matches
(我使用了cutoff=0.8
,因为在这个值之上没有返回值)方法来标记哪些行包含匹配项,然后只获得所需的行最后,为了与问题结尾处发布的结果的格式相匹配,您可以删除或重命名一些列
相关问题 更多 >
编程相关推荐