
本文介绍如何基于一个 DataFrame 列中的部分文本与另一个 DataFrame 列进行匹配,并使用 Pandas 实现高效合并。我们将通过提取目标字符串,创建新的匹配列,最终完成两个 DataFrame 的合并操作,并提供详细的代码示例和注意事项。
问题背景
在数据处理中,经常会遇到需要合并两个 DataFrame 的情况,但标准的 pd.merge 函数要求两个 DataFrame 具有完全匹配的列。当一个 DataFrame 的列值包含另一个 DataFrame 列值的部分文本时,直接使用 pd.merge 无法达到预期效果。本文将提供一种解决方案,通过提取关键文本并创建新的列,实现基于部分字符串匹配的 DataFrame 合并。
解决方案
该方案的核心思想是:
从包含部分文本的 DataFrame (df1) 中,提取出与另一个 DataFrame (df2) 匹配的关键文本。将提取出的文本作为新的一列添加到 df1 中。使用新创建的列作为连接键,将 df1 和 df2 进行合并。
代码实现
假设我们有两个 DataFrame,df1 和 df2,它们的数据结构如下:
import pandas as pd# df1data1 = {'Hostname': ['ServerABC101', 'ServerABC102', 'ServerDDC103', 'ServerDDC609', 'ServerDDC103', 'ServerDDC609'], 'Region': ['US', 'US', 'PAC', 'Emea', 'PAC', 'Emea'], 'Model': ['Cisco', 'Cisco', 'Intel', 'Intel', 'Intel', 'Intel']}df1 = pd.DataFrame(data1)# df2data2 = {'Site': ['ABC', 'DDC'], 'City': ['NYC', 'DAL'], 'State': ['NY', 'TX']}df2 = pd.DataFrame(data2)print("df1:")print(df1)print("ndf2:")print(df2)
我们的目标是基于 df2[‘Site’] 中的文本与 df1[‘Hostname’] 中的部分文本匹配,将 df1 和 df2 合并。假设 df1[‘Hostname’] 中包含 “Server” 之后的三位大写字母代表 df2[‘Site’] 的值。
首先,使用正则表达式从 df1[‘Hostname’] 中提取 Site 代码:
df1['Site'] = df1['Hostname'].str.extract(r"Server([A-Z]{3})")print("ndf1 after extracting Site:")print(df1)
这里,str.extract(r”Server([A-Z]{3})”) 使用正则表达式 Server([A-Z]{3}) 从 Hostname 列中提取匹配 “Server” 后面的三个大写字母。提取的结果将作为新的 ‘Site’ 列添加到 df1 中。
接下来,使用 pd.merge 函数,基于新创建的 ‘Site’ 列将 df1 和 df2 进行合并:
df1 = pd.merge(df1, df2, on='Site', how='left')print("nFinal merged df1:")print(df1)
how=’left’ 参数指定使用左连接,即保留 df1 中的所有行,并将 df2 中匹配的行添加到 df1 中。 如果df1中的Site在df2中没有匹配项,则City和State列将填充NaN。
完整代码示例
import pandas as pd# df1data1 = {'Hostname': ['ServerABC101', 'ServerABC102', 'ServerDDC103', 'ServerDDC609', 'ServerDDC103', 'ServerDDC609'], 'Region': ['US', 'US', 'PAC', 'Emea', 'PAC', 'Emea'], 'Model': ['Cisco', 'Cisco', 'Intel', 'Intel', 'Intel', 'Intel']}df1 = pd.DataFrame(data1)# df2data2 = {'Site': ['ABC', 'DDC'], 'City': ['NYC', 'DAL'], 'State': ['NY', 'TX']}df2 = pd.DataFrame(data2)# 提取 Site 代码df1['Site'] = df1['Hostname'].str.extract(r"Server([A-Z]{3})")# 合并 DataFramedf1 = pd.merge(df1, df2, on='Site', how='left')print(df1)
注意事项
正则表达式: 正确选择和编写正则表达式至关重要。正则表达式需要准确匹配目标文本,避免提取错误的数据。连接类型: how 参数决定了连接的类型。根据实际需求选择合适的连接类型,例如 left、right、inner、outer。缺失值处理: 如果在 df1 中提取的 Site 代码在 df2 中不存在,合并后的 City 和 State 列将会出现缺失值(NaN)。需要根据实际情况处理这些缺失值,例如填充默认值或删除包含缺失值的行。性能优化: 对于大型 DataFrame,使用矢量化操作(如 str.extract)通常比循环遍历更高效。错误处理: 确保代码能够处理 Hostname 列中不包含 “Server” 加上三个大写字母的情况,避免程序崩溃。 可以使用 .fillna() 方法为这些情况设置默认值,或者使用条件语句跳过这些行。
总结
本文介绍了一种基于部分字符串匹配合并 Pandas DataFrames 的方法。通过提取关键文本并创建新的列,我们可以灵活地处理不完全匹配的连接情况。在实际应用中,需要根据具体的数据结构和业务需求,选择合适的正则表达式和连接类型,并注意处理可能出现的缺失值。
以上就是基于部分字符串匹配合并 Pandas DataFrames的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1374237.html
微信扫一扫
支付宝扫一扫