在Pandas DataFrame中拆分脏数据标签并提取指定字段
问题描述
原始Pandas DataFrame示例:
Column1 Column2 Tags Column3 str1 str2 owner:u1,env:prod1 str3 str2 str4 env:prod2,env:prod2 str6 str1 str3 str7 str3 str4 dwdws:qsded,ewe:22w str8
需满足以下要求:
- 保留完整数据集,不能过滤数据
- Tags列可能为空字符串
- 键值对存在重复情况
目标是将owner和env标签提取为单独列,期望输出:
Column1 Column2 Tags Column3 Owner env str1 str2 owner:u1,env:prod1 str3 u1 prod1 str2 str4 env:prod2,env:prod2 str6 prod2 str1 str3 str7 str3 str4 dwdws:qsded,ewe:22w str8
尝试过以下代码但结果全为NaN:
Data['owner']=Data['Tags'].str.slice(Data.Tags.str.find('owner:'),Data.Tags.str.find('owner:')+<length until comma after owner is reached>)
需要用一两行代码解决该问题。
解决方案
使用str.extract结合正则表达式可以直接提取目标标签,自动处理空值和重复键:
Data[['Owner', 'env']] = Data['Tags'].str.extract(r'(?:.*owner:([^,]+))?.*(?:.*env:([^,]+))?')
说明:
- 正则表达式
(?:.*owner:([^,]+))?匹配owner:后直到逗号的内容,?表示该组可选(处理无owner的行) (?:.*env:([^,]+))?同理匹配env:的内容,若存在重复的env键,会提取最后一次出现的值(与示例结果一致)str.extract会自动为未匹配到的行填充空值,无需额外处理空标签的情况
如果需要提取第一个出现的重复键值,调整正则为:
Data[['Owner', 'env']] = Data['Tags'].str.extract(r'(?:owner:([^,]+))?.*?(?:env:([^,]+))?')
内容的提问来源于stack exchange,提问作者Murat Erenturk
相关产品推荐
相关产品推荐

