You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于子串匹配分组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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 07:12:48