首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >熊猫按结果分组为栏

熊猫按结果分组为栏
EN

Stack Overflow用户
提问于 2019-12-17 11:21:18
回答 4查看 468关注 0票数 8

我有这样的数据:

代码语言:javascript
运行
复制
x = pd.DataFrame({
    'audio': ['audio1', 'audio1', 'audio2', 'audio2', 'audio3', 'audio3'],
    'text': ['text1', 'text2', 'text3', 'text4', 'text5', 'text6'],
    'login': ['operator1', 'operator2', 'operator3', 'operator4', 'operator5', 'operator6'] 
})

我试着像这样把它聚合起来:

代码语言:javascript
运行
复制
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()

它可以工作,但我也需要将分组登录添加到行中,使行如下所示:

代码语言:javascript
运行
复制
audio, text1, text2, leven, login1, login2

我试过像lambda x : x.ait[0, 1]这样的东西,但它不起作用

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-12-29 12:43:22

看看您的数据框架,我正在考虑旋转数据框架,下面是我的方法,它使用和的一些列格式来创建一个枢轴数据格式。

Option1:然后您可以使用应用该函数

代码语言:javascript
运行
复制
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()

代码语言:javascript
运行
复制
    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: (我更喜欢这个)

您也可以使用列表理解来进行同样的操作,只需将最后一行替换为:

代码语言:javascript
运行
复制
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()

代码语言:javascript
运行
复制
    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

Option3:

如果leven列的位置很重要,则可以使用

代码语言:javascript
运行
复制
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()

代码语言:javascript
运行
复制
    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
票数 6
EN

Stack Overflow用户

发布于 2019-12-26 23:12:21

这就是你要找的吗?

代码语言:javascript
运行
复制
x1 = x.groupby('audio',)['login'].agg(
     [
     ('operator1', lambda x : x.iat[0]),
     ('operator2', lambda x : x.iat[1]),
     ('leven', lambda x: Levenshtein.distance(x.iat[0], x.iat[1])) #some function works with grouped text
     ]
 ).reset_index()

 x2 = 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()

x1.merge(x2)

    audio  operator1  operator2  leven  text1  text2
0  audio1  operator1  operator2      1  text1  text2
1  audio2  operator3  operator4      1  text3  text4
2  audio3  operator5  operator6      1  text5  text6
票数 2
EN

Stack Overflow用户

发布于 2019-12-27 05:45:50

当您有很多列时,这个解决方案很好用,它会自动地扩展它们,这样您就不必手动列出它们。

代码语言:javascript
运行
复制
x = pd.DataFrame({
    'audio': ['audio1', 'audio1', 'audio2', 'audio2', 'audio3', 'audio3'],
    'text': ['text1', 'text2', 'text3', 'text4', 'text5', 'text6'],
    'login': ['operator1', 'operator2', 'operator3', 'operator4', 'operator5', 'operator6'] 
})


text = x.groupby(['audio']).agg(list)['text'].apply(pd.Series).rename(columns=lambda x: f'text{x+1}')

login = x.groupby(['audio']).agg(list)['login'].apply(pd.Series).rename(columns=lambda x: f'login{x+1}')

text['leven'] = df.apply(lambda x: Levenshtein.distance(x.text1, x.text2), axis=1) 

df = text.assign(**login)

        text1  text2  leven     login1     login2
audio                                            
audio1  text1  text2      1  operator1  operator2
audio2  text3  text4      1  operator3  operator4
audio3  text5  text6      1  operator5  operator6
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59373189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档