Je souhaite fusionner plusieurs chaînes dans un dataframe basé sur un groupedby dans Pandas.
C'est mon code pour l'instant:
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)
Je veux que le résultat final ressemble à ceci:
Je ne comprends pas comment je peux utiliser groupby et appliquer une sorte de concaténation des chaînes dans la colonne "texte". Toute aide appréciée!
python-3.x
pandas
pandas-groupby
mattiasostmar
la source
la source
pandas < 1.0
,.drop_duplicates()
ignore l'index, ce qui peut donner des résultats inattendus. Vous pouvez éviter cela en utilisant à la.agg(lambda x: ','.join(x))
place de.transform().drop_duplicates()
.drop_duplicates()
peut ne pas fonctionner si vous n'incluez pas de paramètredrop_duplicates(inplace=True)
ou réécrivez simplement la ligne de code commedf = df[['name','text','month']].drop_duplicates()
nous pouvons regrouper par les colonnes 'nom' et 'mois', puis appeler les fonctions agg () des objets DataFrame de Panda.
La fonctionnalité d'agrégation fournie par la fonction agg () permet de calculer plusieurs statistiques par groupe en un seul calcul.
df.groupby(['name', 'month'], as_index = False).agg({'text': ' '.join})
la source
La réponse d'EdChum vous offre beaucoup de flexibilité, mais si vous souhaitez simplement concatérer des chaînes dans une colonne d'objets de liste, vous pouvez également:
output_series = df.groupby(['name','month'])['text'].apply(list)
la source
Pour moi, les solutions ci-dessus étaient proches mais ont ajouté des / n et dtype: object indésirables, voici donc une version modifiée:
df.groupby(['name', 'month'])['text'].apply(lambda text: ''.join(text.to_string(index=False))).str.replace('(\\n)', '').reset_index()
la source