Ich möchte mehrere Zeichenfolgen in einem Datenrahmen zusammenführen, der auf einer Gruppierung in Pandas basiert.
Dies ist mein bisheriger 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)
Ich möchte, dass das Endergebnis so aussieht:
Ich verstehe nicht, wie ich groupby verwenden und eine Art Verkettung der Zeichenfolgen in der Spalte "Text" anwenden kann. Jede Hilfe geschätzt!
quelle
pandas < 1.0
,.drop_duplicates()
ignoriert den Index, die zu unerwarteten Ergebnissen führen kann. Sie können dies vermeiden, indem Sie.agg(lambda x: ','.join(x))
anstelle von verwenden.transform().drop_duplicates()
.drop_duplicates()
funktioniert möglicherweise nicht, wenn Sie keinen Parameter einschließendrop_duplicates(inplace=True)
oder die Codezeile einfach neu schreiben alsdf = df[['name','text','month']].drop_duplicates()
Wir können nach den Spalten 'name' und 'month' gruppieren und dann agg () -Funktionen der DataFrame-Objekte von Panda aufrufen.
Die von der Funktion agg () bereitgestellte Aggregationsfunktion ermöglicht die Berechnung mehrerer Statistiken pro Gruppe in einer Berechnung.
df.groupby(['name', 'month'], as_index = False).agg({'text': ' '.join})
quelle
Die Antwort von EdChum bietet Ihnen viel Flexibilität. Wenn Sie jedoch nur Zeichenfolgen in eine Spalte mit Listenobjekten einbinden möchten, können Sie auch:
output_series = df.groupby(['name','month'])['text'].apply(list)
quelle
Für mich waren die oben genannten Lösungen nahe beieinander, fügten jedoch einige unerwünschte / n und dtype: object hinzu. Hier ist also eine modifizierte Version:
df.groupby(['name', 'month'])['text'].apply(lambda text: ''.join(text.to_string(index=False))).str.replace('(\\n)', '').reset_index()
quelle