我有这样的数据集:
data = {'id': ['1','2'],
'seq': ['1, 2, 001','2, 5, 4, 5, 8, 009']}
new_df = pd.DataFrame(data)
输出:
id seq
0 1 1, 2, 001
1 2 2, 5, 4, 5, 8, 009
我想得到:
new_data = {'id': ['1', '1','2','2','2','2','2'],
'seq': ['1, 001','1, 2, 001','2, 009','2, 5, 009','2, 5, 4, 009','2, 5, 4, 5, 009','2, 5, 4, 5, 8, 009']}
new_df = pd.DataFrame(new_data)
输出:
id seq
0 1 1, 001
1 1 1, 2, 001
2 2 2, 009
3 2 2, 5, 009
4 2 2, 5, 4, 009
5 2 2, 5, 4, 5, 009
6 2 2, 5, 4, 5, 8, 009
我从爆炸开始:
df.assign(seq=df.seq.str.split(',\s*')).explode('seq')
现在不知道如何继续。 我会对您的评论感到高兴
答案 0 :(得分:2)
您可以使用str.split
,然后再使用apply
和explode
函数,如下所示:
data = {'id': ['1','2'],
'seq': ['1, 2, 001','2, 5, 4, 5, 8, 009']}
new_df = pd.DataFrame(data)
new_df['seq'] = new_df.seq.str.split(",").apply(lambda arr: [','.join(arr[:i] + arr[-1:]) for i in range(1,len(arr))])
new_df.explode('seq')
答案 1 :(得分:2)
使用嵌套列表推导和添加最后一个值和join
,然后创建新列和explode
:
a=[[', '.join(x[:i]+[x[-1]]) for i,y in enumerate(x[:-1],1)] for x in df.seq.str.split(',\s*')]
df = df.assign(seq=a).explode('seq')
print (df)
id seq
0 1 1, 001
0 1 1, 2, 001
1 2 2, 009
1 2 2, 5, 009
1 2 2, 5, 4, 009
1 2 2, 5, 4, 5, 009
1 2 2, 5, 4, 5, 8, 009
替代解决方案:
data = {'id': ['1','2', '3'],
'seq': ['1, 2, 001','2, 5, 4, 5, 8, 009', '1']}
df = pd.DataFrame(data)
print (df)
id seq
0 1 1, 2, 001
1 2 2, 5, 4, 5, 8, 009
2 3 1
a = [[', '.join(x[:i]+x[-1:]) for i,y in enumerate(x[:-1],1)]
if len(x) > 1 else x for x in df.seq.str.split(',\s*')]
df = df.assign(seq=a).explode('seq')
print (df)
id seq
0 1 1, 001
0 1 1, 2, 001
1 2 2, 009
1 2 2, 5, 009
1 2 2, 5, 4, 009
1 2 2, 5, 4, 5, 009
1 2 2, 5, 4, 5, 8, 009
2 3 1