Chcę scalić kilka ciągów w ramce danych opartej na zgrupowaniu w Pandas.
To jest mój kod do tej pory:
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)
Chcę, żeby efekt końcowy wyglądał tak:
Nie rozumiem, jak mogę używać funkcji Groupby i zastosować jakieś połączenie ciągów w kolumnie „tekst”. Każda pomoc doceniona!
python-3.x
pandas
pandas-groupby
mattiasostmar
źródło
źródło
pandas < 1.0
,.drop_duplicates()
ignoruje indeks, który może dać nieoczekiwane rezultaty. Możesz tego uniknąć, używając.agg(lambda x: ','.join(x))
zamiast.transform().drop_duplicates()
.drop_duplicates()
może nie działać, jeśli niedrop_duplicates(inplace=True)
df = df[['name','text','month']].drop_duplicates()
możemy pogrupować według kolumn 'name' i 'month', a następnie wywołać funkcje agg () obiektów DataFrame Pandy.
Funkcja agregacji zapewniana przez funkcję agg () pozwala na obliczenie wielu statystyk na grupę w jednym obliczeniu.
df.groupby(['name', 'month'], as_index = False).agg({'text': ' '.join})
źródło
Odpowiedź EdChum zapewnia dużą elastyczność, ale jeśli chcesz po prostu połączyć ciągi znaków w kolumnę obiektów list, możesz również:
output_series = df.groupby(['name','month'])['text'].apply(list)
źródło
Dla mnie powyższe rozwiązania były bliskie, ale dodałem trochę niechcianych / n i dtype: obiekt, więc oto zmodyfikowana wersja:
df.groupby(['name', 'month'])['text'].apply(lambda text: ''.join(text.to_string(index=False))).str.replace('(\\n)', '').reset_index()
źródło