Maison >développement back-end >Tutoriel Python >Comment concaténer des chaînes de plusieurs lignes dans Pandas à l'aide de Groupby ?

Comment concaténer des chaînes de plusieurs lignes dans Pandas à l'aide de Groupby ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-15 12:17:14539parcourir

How to Concatenate Strings from Multiple Rows in Pandas Using Groupby?

Concaténer des chaînes de plusieurs lignes à l'aide de Pandas Groupby

Lorsque vous travaillez avec des dataframes, il peut y avoir des situations où vous devez consolider les chaînes de plusieurs lignes tout en les regroupant selon des critères précis. Pandas offre une solution pratique pour cela grâce à ses fonctions de regroupement et de transformation.

Énoncé du problème

Étant donné une trame de données avec les colonnes « nom », « texte » et « mois » ', l'objectif est de concaténer les chaînes dans la colonne 'texte' pour chaque combinaison unique de 'nom' et 'mois'. Le résultat souhaité est une trame de données avec des combinaisons uniques de « nom » et de « mois » et les valeurs de « texte » concaténées.

Solution

Pour y parvenir, vous pouvez utiliser les étapes suivantes :

  1. Regroupez la trame de données par « nom » et « mois » à l'aide de groupby() fonction.
  2. Utilisez la fonction transform() pour appliquer une expression lambda qui joint les entrées « texte » pour chaque groupe.
  3. Pour supprimer les lignes en double, supprimez les doublons de la trame de données résultante à l'aide de la fonction Fonction drop_duplicates().

Voici un exemple de code :

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)

df['text'] = df[['name','text','month']].groupby(['name','month'])['text'].transform(lambda x: ','.join(x))
df[['name','text','month']].drop_duplicates()

Le code ci-dessus génère une trame de données avec le résultat souhaité :

    name         text  month
0  name1       hej,du     11
2  name1        aj,oj     12
4  name2     fin,katt     11
6  name2  mycket,lite     12

Solution alternative

Au lieu d'utiliser transform(), vous pouvez également utiliser apply() puis reset_index() pour arriver au même résultat. Le code mis à jour serait :

df.groupby(['name','month'])['text'].apply(','.join).reset_index()

Cette version simplifiée élimine l'expression lambda et fournit une solution plus concise.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn