Łączenie strun z kilku rzędów za pomocą Pandy groupby

Chcę połączyć kilka łańcuchów w ramce danych opartej na groupedby w pandach.

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ę, aby efekt końcowy wyglądał tak:

Tutaj wpisz opis obrazka

Nie rozumiem, jak mogę użyć groupby i zastosować jakiś rodzaj konkatenacji łańcuchów w kolumnie "tekst". Każda pomoc mile widziana!

Author: Trenton McKinney, 2014-12-04

5 answers

Możesz grupować kolumny 'name' i 'month', następnie wywołać transform, które zwrócą dane wyrównane do oryginalnego df i zastosować lambda, gdzie join wpisy tekstowe:

In [119]:

df['text'] = df[['name','text','month']].groupby(['name','month'])['text'].transform(lambda x: ','.join(x))
df[['name','text','month']].drop_duplicates()
Out[119]:
    name         text  month
0  name1       hej,du     11
2  name1        aj,oj     12
4  name2     fin,katt     11
6  name2  mycket,lite     12

Podaję oryginalny df, przekazując listę interesujących kolumn df[['name','text','month']] tutaj, a następnie wywołuję drop_duplicates

EDIT właściwie mogę po prostu zadzwonić apply i wtedy reset_index:

In [124]:

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

Out[124]:
    name  month         text
0  name1     11       hej,du
1  name1     12        aj,oj
2  name2     11     fin,katt
3  name2     12  mycket,lite

Update

lambda jest tu niepotrzebny:

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

Out[38]: 
    name  month         text
0  name1     11           du
1  name1     12        aj,oj
2  name2     11     fin,katt
3  name2     12  mycket,lite
 186
Author: EdChum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-10 09:48:27

Możemy groupby kolumny 'Nazwa' i 'miesiąc', następnie wywołać funkcje agg() obiektów ramki danych Pandy.

Funkcja agregacji dostarczana przez funkcję agg () umożliwia obliczanie wielu statystyk na grupę w jednym obliczeniu.

df.groupby(['name', 'month'], as_index = False).agg({'text': ' '.join})

Tutaj wpisz opis obrazka

 54
Author: Ram Prajapati,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-12-11 10:48:40

ODPOWIEDŹ Edchuma zapewnia Ci dużą elastyczność, ale jeśli chcesz po prostu połączyć łańcuchy w kolumnę obiektów listy, możesz również:

output_series = df.groupby(['name','month'])['text'].apply(list)

 29
Author: Rutger Hofste,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-28 19:18:24

Dla mnie powyższe rozwiązania były bliskie, ale dodano trochę niechcianych /n i dtype: object, więc oto zmodyfikowana wersja:

df.groupby(['name', 'month'])['text'].apply(lambda text: ''.join(text.to_string(index=False))).str.replace('(\\n)', '').reset_index()
 8
Author: Nic Scozzaro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-28 15:00:16

Jeśli chcesz połączyć swój "tekst"na liście:

df.groupby(['name', 'month'], as_index = False).agg({'text': list})
 -1
Author: Ismail,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-11-25 21:19:53