Con*_*111 8 python dataframe pandas
我有这样的数据框:
x = pd.DataFrame({
'audio': ['audio1', 'audio1', 'audio2', 'audio2', 'audio3', 'audio3'],
'text': ['text1', 'text2', 'text3', 'text4', 'text5', 'text6'],
'login': ['operator1', 'operator2', 'operator3', 'operator4', 'operator5', 'operator6']
})
Run Code Online (Sandbox Code Playgroud)
我正在尝试像这样聚合它:
x1 = x.groupby('audio')['text'].agg(
[
('text1', lambda x : x.iat[0]),
('text2', lambda x : x.iat[1]),
('leven', lambda x: Levenshtein.distance(x.iat[0], x.iat[1])) #some function works with grouped text
]
).reset_index()
Run Code Online (Sandbox Code Playgroud)
它可以工作,但我还需要将分组登录添加到行,以使行像这样:
audio, text1, text2, leven, login1, login2
Run Code Online (Sandbox Code Playgroud)
我试过类似的东西,lambda x : x.ait[0, 1]但它不起作用
查看您的数据框,我正在考虑旋转数据框,下面是我的方法,它利用groupby().cumcount()并unstack使用一些列格式来创建一个旋转的数据框。
选项1:
然后您可以利用df.apply应用该功能
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()
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
选项2: (我宁愿这个)
您也可以使用列表理解来执行相同的操作,只需将最后一行替换为:
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()
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
选项3:
如果leven列的位置很重要,您可以使用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()
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
367 次 |
| 最近记录: |