Nhìn vào khung dữ liệu của bạn, tôi nghĩ đến việc xoay khung dữ liệu, dưới đây là cách tiếp cận của tôi để sử dụng groupby().cumcount()
và unstack
với một số định dạng cột để tạo một khung dữ liệu được chia nhỏ.
Tùy chọn 1:
Sau đó, bạn có thể sử dụng df.apply
để áp dụng chức năng
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
Tùy chọn 2: ( Tôi thích cái này )
Bạn cũng có thể sử dụng cách hiểu danh sách để làm tương tự, chỉ cần thay thế dòng cuối cùng bằng:
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
Tùy chọn 3:
Nếu vị trí của leven
cột là quan trọng, bạn có thể sử dụng 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