Eu quero mesclar várias strings em um dataframe baseado em um agrupado no Pandas.
Este é o meu código até agora:
import pandas as pd
from io import StringIO
data = StringIO("""
"name1","hej","2014-11-01"
"name1","du","2014-11-02"
"name1","aj","2014-12-01"
"name1","oj","2014-12-02"
"name2","fin","2014-11-01"
"name2","katt","2014-11-02"
"name2","mycket","2014-12-01"
"name2","lite","2014-12-01"
""")
# load string as stream into dataframe
df = pd.read_csv(data,header=0, names=["name","text","date"],parse_dates=[2])
# add column with month
df["month"] = df["date"].apply(lambda x: x.month)
Eu quero que o resultado final seja assim:
Não entendo como posso usar o groupby e aplicar algum tipo de concatenação das strings na coluna "texto". Qualquer ajuda apreciada!
python-3.x
pandas
pandas-groupby
Mattiasostmar
fonte
fonte
pandas < 1.0
,.drop_duplicates()
ignora o índice, o que pode gerar resultados inesperados. Você pode evitar isso usando em.agg(lambda x: ','.join(x))
vez de.transform().drop_duplicates()
.drop_duplicates()
pode não funcionar se você não incluir o parâmetrodrop_duplicates(inplace=True)
ou apenas reescrever a linha de código comodf = df[['name','text','month']].drop_duplicates()
podemos agrupar as colunas 'nome' e 'mês' e, em seguida , chamar as funções agg () dos objetos DataFrame do Panda.
A funcionalidade de agregação fornecida pela função agg () permite que várias estatísticas sejam calculadas por grupo em um cálculo.
df.groupby(['name', 'month'], as_index = False).agg({'text': ' '.join})
fonte
A resposta do EdChum fornece muita flexibilidade, mas se você quiser apenas concatear strings em uma coluna de objetos de lista, você também pode:
output_series = df.groupby(['name','month'])['text'].apply(list)
fonte
Para mim, as soluções acima foram próximas, mas adicionaram alguns / n's e dtype: object indesejados, então aqui está uma versão modificada:
df.groupby(['name', 'month'])['text'].apply(lambda text: ''.join(text.to_string(index=False))).str.replace('(\\n)', '').reset_index()
fonte
Se você deseja concatenar seu "texto" em uma lista:
df.groupby(['name', 'month'], as_index = False).agg({'text': list})
fonte