Eu tenho o dataframe assim:
x = pd.DataFrame({
'audio': ['audio1', 'audio1', 'audio2', 'audio2', 'audio3', 'audio3'],
'text': ['text1', 'text2', 'text3', 'text4', 'text5', 'text6'],
'login': ['operator1', 'operator2', 'operator3', 'operator4', 'operator5', 'operator6']
})
Eu estou tentando agregá-lo assim:
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()
e funciona, mas também preciso adicionar logins agrupados à linha, para criar uma linha como esta:
audio, text1, text2, leven, login1, login2
Eu tentei algo como, lambda x : x.ait[0, 1]
mas não funciona
Respostas:
Olhando para o seu quadro de dados, estou pensando em girar o quadro de dados. Abaixo está minha abordagem que utiliza
groupby().cumcount()
eunstack
com alguma formatação de coluna para criar um quadro de dados dinâmico.Opção 1: você pode
df.apply
aplicar para aplicar a funçãoOption2: ( eu preferiria isso )
Você também pode usar uma compreensão de lista para fazer o mesmo, basta substituir a última linha por:
Opção 3:
Se a localização da
leven
coluna for importante, você pode usardf.insert
:fonte
FuzzyWuzzy
usar o Algoritmo de distância de LevenshteinÉ isso que você está procurando:
fonte
Essa solução funciona muito bem quando você tem muitas colunas, expande-as automaticamente para que você não precise listá-las manualmente.
fonte
Você pode simplesmente modificar sua
agg
expressão assim:fonte