我有这样的数据:
x = pd.DataFrame({
'audio': ['audio1', 'audio1', 'audio2', 'audio2', 'audio3', 'audio3'],
'text': ['text1', 'text2', 'text3', 'text4', 'text5', 'text6'],
'login': ['operator1', 'operator2', 'operator3', 'operator4', 'operator5', 'operator6']
})我试着像这样把它聚合起来:
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()它可以工作,但我也需要将分组登录添加到行中,使行如下所示:
audio, text1, text2, leven, login1, login2我试过像lambda x : x.ait[0, 1]这样的东西,但它不起作用
发布于 2019-12-29 12:43:22
看看您的数据框架,我正在考虑旋转数据框架,下面是我的方法,它使用和的一些列格式来创建一个枢轴数据格式。
Option1:然后您可以使用应用该函数
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 1Option2: (我更喜欢这个)
您也可以使用列表理解来进行同样的操作,只需将最后一行替换为:
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 1Option3:
如果leven列的位置很重要,则可以使用
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发布于 2019-12-26 23:12:21
这就是你要找的吗?
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发布于 2019-12-27 05:45:50
当您有很多列时,这个解决方案很好用,它会自动地扩展它们,这样您就不必手动列出它们。
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 operator6https://stackoverflow.com/questions/59373189
复制相似问题