Olhando para o seu quadro de dados, estou pensando em girar o quadro de dados. Abaixo está minha abordagem que utiliza groupby().cumcount()
e unstack
com alguma formatação de coluna para criar um quadro de dados dinâmico.
Opção 1:
você pode df.apply
aplicar para aplicar a função
m = x.assign(k=x.groupby('audio').cumcount().add(1)).set_index(['audio','k']).unstack()
m.columns=[f"{a}{b}" for a,b in m.columns]
m = m.assign(leven=m.apply(lambda x:
Levenshtein.distance(x['text1'],x['text2']),1)).reset_index()
audio text1 text2 login1 login2 leven
0 audio1 text1 text2 operator1 operator2 1
1 audio2 text3 text4 operator3 operator4 1
2 audio3 text5 text6 operator5 operator6 1
Option2: ( eu preferiria isso )
Você também pode usar uma compreensão de lista para fazer o mesmo, basta substituir a última linha por:
m = x.assign(k=x.groupby('audio').cumcount().add(1)).set_index(['audio','k']).unstack()
m.columns=[f"{a}{b}" for a,b in m.columns]
m = m.assign(leven=[Levenshtein.distance(a,b) for
a,b in zip(m['text1'],m['text2'])]).reset_index()
audio text1 text2 login1 login2 leven
0 audio1 text1 text2 operator1 operator2 1
1 audio2 text3 text4 operator3 operator4 1
2 audio3 text5 text6 operator5 operator6 1
Opção 3:
Se a localização da leven
coluna for importante, você pode usar df.insert
:
m=x.assign(k=x.groupby('audio').cumcount().add(1)).set_index(['audio','k']).unstack()
m.columns=[f"{a}{b}" for a,b in m.columns]
m.insert(2,'leven',[Levenshtein.distance(a,b) for a,b in zip(m['text1'],m['text2'])])
m=m.reset_index()
audio text1 text2 leven login1 login2
0 audio1 text1 text2 1 operator1 operator2
1 audio2 text3 text4 1 operator3 operator4
2 audio3 text5 text6 1 operator5 operator6