熊猫按结果分组到列

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]但它不起作用

ank*_*_91 6

查看您的数据框,我正在考虑旋转数据框,下面是我的方法,它利用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)