Nối các chuỗi từ nhiều hàng bằng nhóm Pandas


93

Tôi muốn hợp nhất một số chuỗi trong khung dữ liệu dựa trên một nhóm trong Pandas.

Đâ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:

nhập mô tả hình ảnh ở đây

Tôi không hiểu cách sử dụng groupby và áp dụng một số kiểu nối các chuỗi trong cột "văn bản". Bất kỳ sự giúp đỡ nào được đánh giá cao!

Câu trả lời:


162

Bạn có thể nhóm theo các cột 'name''month', sau đó gọi transformnó sẽ trả về dữ liệu được căn chỉnh theo df ban đầu và áp dụng lambda nơi chúng ta joinnhập 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 ban đầu bằng cách chuyển danh sách các cột quan tâm df[['name','text','month']]ở đây và sau đó gọidrop_duplicates

CHỈNH SỬA thực sự tôi chỉ có thể gọi applyvà 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 lambdalà 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

1
Trong pandas < 1.0, .drop_duplicates()bỏ qua chỉ mục, có thể cho kết quả không mong muốn. Bạn có thể tránh điều này bằng cách sử dụng .agg(lambda x: ','.join(x))thay vì .transform().drop_duplicates().
Matthias Fripp

Gọn gàng và không phức tạp. Cũng có thể hiểu được nổi bật
Raghavan vmvs

drop_duplicates()có thể không hoạt động nếu bạn không bao gồm tham số drop_duplicates(inplace=True)hoặc chỉ viết lại dòng mã dưới dạng df = df[['name','text','month']].drop_duplicates()
IAmBotmaker

44

chúng ta có thể groupby 'tên' và 'tháng' cột, sau đó gọi agg () chức năng của các đối tượng DataFrame Panda của.

Chức năng tổng hợp được cung cấp bởi hàm agg () cho phép tính nhiều thống kê cho mỗi nhóm trong một phép tính.

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

nhập mô tả hình ảnh ở đây


27

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

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


Trời ạ, bạn vừa tiết kiệm cho tôi rất nhiều thời gian. Cảm ơn bạn. Đây là cách tốt nhất để tập hợp danh sách đăng ký / id người dùng theo thứ tự thời gian thành 'nhóm thuần tập' mà tôi biết. Cảm ơn bạn một lần nữa.
Alex Fedotov

5

Đối với tôi, các giải pháp ở trên đã gần gũi nhưng đã thêm một số đối tượng / n và dtype: không mong muốn, vì vậy đây là một phiên bản sửa đổi:

df.groupby(['name', 'month'])['text'].apply(lambda text: ''.join(text.to_string(index=False))).str.replace('(\\n)', '').reset_index()
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.