我有一个类似于下面的数据帧:
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')
)
)