2014-12-04 20 views
12

Chcę scalić kilka ciągów w ramce danych na podstawie pogrupowane w Pandach.Łączenie ciągów z kilku wierszy przy użyciu grupy Pandy przez

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ę końcowy wynik powinien wyglądać tak:

enter image description here

Nie rozumiem, jak można używać i stosować jakiś GroupBy rodzaj konkatenacji łańcuchów w kolumnie "tekst". Każda pomoc doceniona!

Odpowiedz

18

Można GroupBy z 'name' i 'month' kolumny, a następnie zadzwonić transform która będzie zwracać dane wyrównane do oryginału 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 

ja sub oryginalny df przekazując lista kolumn zainteresowania df[['name','text','month']] tutaj, a następnie zadzwonić drop_duplicates

EDIT faktycznie mogę po prostu zadzwonić i wtedy :

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 

aktualizacja

lambda jest niepotrzebna tutaj:

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 
2

Odpowiedź przez EdChum oferuje dużą elastyczność, ale jeśli chcesz tylko concateate struny do kolumny obiektów listy można również:

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

+0

Uwaga, działa to tylko z jedną kolumną na raz. – ybull

Powiązane problemy