我认为熊猫桌有一个棘手的问题。 我有以下格式的标签数据和文档表:
Tags Docs
0 A1-0001-AA-001/002 Doc1
1 A1-0001-AA-003/004 Doc1
2 A1-0001-AA-006/009 Doc2
3 A1-111-BB-001A/B/C Doc3
4 A1-222-BC-002A/B/C Doc4
5 A1-222-BB-001/2/3 Doc4
6 A1-3333-CD-001/003 Doc6
或者如果您想复制代码:
d= {'Tags':['A1-0001-AA-001/002',
'A1-0001-AA-003/004',
'A1-0001-AA-006/009',
'A1-111-BB-001A/B/C',
'A1-222-BC-002A/B/C',
'A1-222-BB-001/2/3',
'A1-3333-CD-001/003',
], 'Docs': ['Doc1', 'Doc1','Doc2','Doc3','Doc4','Doc4','Doc6']}
df = pd.DataFrame(data=d)
我想用定界符“ /”分割“标签”中的行,并按文档分组。问题是,如果我用定界符分割,第二部分将被省略而没有后缀,并且此后缀在每一行上都是不同的。有没有办法拆分这些?预先感谢您的任何想法!
答案 0 :(得分:1)
如果每组从原始数据行创建的/
之后的值长度相同,则解决方案有效。
首先将Series.str.split
与DataFrame.explode
结合使用,然后从每个组的第一个值中按长度分割值,然后将其添加到所有其他值:
df = df.assign(Tags=df['Tags'].str.split('/')).explode('Tags')
m = df.index.duplicated()
s = df['Tags'].str.len().groupby(level=0).transform('last')
df['new'] = [x[:-y] for x, y in zip(df['Tags'], s)]
df['Tags'] = (df['Tags'].mask(m, df.pop('new')
.groupby(level=0)
.transform('first')
.add(df['Tags'])))
df = df.reset_index(drop=True)
print (df)
Tags Docs
0 A1-0001-AA-001 Doc1
1 A1-0001-AA-002 Doc1
2 A1-0001-AA-003 Doc1
3 A1-0001-AA-004 Doc1
4 A1-0001-AA-006 Doc2
5 A1-0001-AA-009 Doc2
6 A1-111-BB-001A Doc3
7 A1-111-BB-001B Doc3
8 A1-111-BB-001C Doc3
9 A1-222-BC-002A Doc4
10 A1-222-BC-002B Doc4
11 A1-222-BC-002C Doc4
12 A1-222-BB-001 Doc4
13 A1-222-BB-002 Doc4
14 A1-222-BB-003 Doc4
15 A1-3333-CD-001 Doc6
16 A1-3333-CD-003 Doc6