在熊猫中将一行数据拆分为多个

时间:2020-10-27 08:45:10

标签: python pandas

我认为熊猫桌有一个棘手的问题。 我有以下格式的标签数据和文档表:


                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)

我想用定界符“ /”分割“标签”中的行,并按文档分组。问题是,如果我用定界符分割,第二部分将被省略而没有后缀,并且此后缀在每一行上都是不同的。有没有办法拆分这些?预先感谢您的任何想法!

1 个答案:

答案 0 :(得分:1)

如果每组从原始数据行创建的/之后的值长度相同,则解决方案有效。

首先将Series.str.splitDataFrame.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