2014-12-04 12 views
12

Tôi muốn hợp nhất một số chuỗi trong một khung dữ liệu dựa trên một nhóm trong Pandas.Ghép chuỗi từ một số hàng bằng cách sử dụng Pandas groupby

Đây là mã của tôi cho đến nay:

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) 

Tôi muốn kết quả cuối cùng trông như thế này:

enter image description here

Tôi không hiểu làm thế nào tôi có thể sử dụng groupby và áp dụng một số loại nối của các chuỗi trong cột "văn bản". Bất kỳ trợ giúp nào được đánh giá cao!

Trả lời

18

Bạn có thể groupby các cột 'name''month', sau đó gọi transform mà sẽ trả về dữ liệu liên kết với bản gốc df và áp dụng một lambda nơi chúng tôi join các mục văn bản:

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 

tôi phụ df gốc bằng cách đi qua một danh sách các cột quan tâm df[['name','text','month']] đây và sau đó gọi drop_duplicates

EDIT thực sự tôi có thể chỉ cần gọi apply và sau đó 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 

cập nhật

các lambda là không cần thiết ở đây:

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

Câu trả lời bởi EdChum cung cấp cho bạn với rất nhiều tính linh hoạt nhưng nếu bạn chỉ muốn concateate chuỗi thành một cột của đối tượng danh sách, bạn cũng có thể:

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

+0

Lưu ý, điều này chỉ hoạt động với một cột tại một thời điểm. – ybull

Các vấn đề liên quan