基于子串匹配分组DataFrame并更新标签、添加组标识的技术问询
解决方案:基于子串匹配更新DataFrame并分组
我来帮你搞定这个DataFrame的匹配分组需求,直接上可行的实现方案,分步骤给你讲明白:
完整实现代码
import pandas as pd # 初始化原始数据 df1 = pd.DataFrame({'A': ['2018 43 NFO BID_-324 dfs.DataNode X', '2018 5 NFO dfs.FSNames BID_123 XX', '2019 13 NFO BID_-398 dfs.DataNode X X', '2019 45 NFO dfs.DataNode BID_-324', '2019 14 NFO BID_123 dfs.DataNode X'], 'label':[ 0,0,0,0,0]}) df2 = pd.DataFrame({'Id':['BID_-324', 'BID_123', 'BID_-398'], 'label':[1,1,2]}) # 1. 为df1每行匹配对应的Id并更新label def match_target_id(row): for _, id_item in df2.iterrows(): if id_item['Id'] in row['A']: return id_item['Id'], id_item['label'] return None, None # 处理无匹配的边缘情况,需求中暂不需要 # 应用函数并拆分结果为两列 df1[['matched_Id', 'label']] = df1.apply(match_target_id, axis=1, result_type='expand') # 2. 生成组标识gid,保持df2的Id顺序对应分组顺序 id_gid_mapping = {id_val: idx+1 for idx, id_val in enumerate(df2['Id'])} df1['gid'] = df1['matched_Id'].map(id_gid_mapping) # 3. 按gid分组(保持组内原顺序)并调整格式 final_df = df1[['gid', 'A', 'label']].sort_values(by='gid', kind='mergesort').reset_index(drop=True) print(final_df)
步骤详解
- 子串匹配与label更新:定义
match_target_id函数逐行检查df2的Id是否是df1中A列的子串,找到匹配后返回对应的Id和label值。通过apply函数批量处理,直接覆盖df1原有的label列。 - 组标识gid生成:根据df2中Id的顺序创建映射字典,这样生成的gid会和df2的Id顺序保持一致(比如
BID_-324对应组1,BID_123对应组2),确保分组逻辑符合需求。 - 分组并保持原顺序:使用
sort_values按gid排序,选择kind='mergesort'(稳定排序算法),这样同组的行会被放在一起,同时组内行的顺序完全保留df1中的原始出现顺序。最后重置索引,匹配预期输出格式。
运行代码后,输出的final_df完全符合你的预期:
gid A label 0 1 2018 43 NFO BID_-324 dfs.DataNode X 1 1 1 2019 45 NFO dfs.DataNode BID_-324 1 2 2 2018 5 NFO dfs.FSNames BID_123 XX 1 3 2 2019 14 NFO BID_123 dfs.DataNode X 1 4 3 2019 13 NFO BID_-398 dfs.DataNode X X 2
内容的提问来源于stack exchange,提问作者Shew
相关产品推荐
相关产品推荐

