在pandas数据框架中分隔脏数据中的标签



我有一个类似于下面的数据帧:

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

我不能根据标签过滤数据,并清除不正确的标签格式,因为我需要整个数据集。请注意:

  • 第三行,标签列已经被过滤为空字符串
  • 键值对可能有重复。

我需要有我感兴趣的标签作为一个单独的列像这样:

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       

我试着这样做:

Data['owner']=Data['Tags'].str.slice(Data.Tags.str.find('owner:'),Data.Tags.str.find('owner:')+<length until comma after owner is reached>) 

我得到列中的所有NaN值。我希望有一个或两个liner来过滤掉这个

Thanks in advance

一个通用的方法将是extractall的键:值对,然后pivot:

out = (df.join(df['Tags'].str.extractall('([^:,]+):([^:,]+)')
.droplevel('match').pivot(columns=0, values=1))
)

输出:

Column1 Column2                 Tags Column3  dwdws   env  ewe owner
0    str1    str2    owner:u1,env:prod    str3    NaN  prod  NaN    u1
1    str2    str4             env:prod    str6    NaN  prod  NaN   NaN
2    str1    str3                  NaN    str7    NaN   NaN  NaN   NaN
3    str3    str4  dwdws:qsded,ewe:22w    str8  qsded   NaN  22w   NaN

如果您想限制标签,请调整正则表达式的第一部分:

out = (df.join(df['Tags'].str.extractall('(owner|env):([^:,]+)')
.droplevel('match').pivot(columns=0, values=1))
)

输出:

Column1 Column2                 Tags Column3   env owner
0    str1    str2    owner:u1,env:prod    str3  prod    u1
1    str2    str4             env:prod    str6  prod   NaN
2    str1    str3                  NaN    str7   NaN   NaN
3    str3    str4  dwdws:qsded,ewe:22w    str8   NaN   NaN

处理重复密钥

out = (df.join(df['Tags'].str.extractall('(owner|env):([^:,]+)')
.droplevel('match').reset_index()
.pivot_table(index='index', columns=0, values=1, aggfunc='first')
)
)

最新更新