2014-05-21 29 views
8

Tôi có một df dataframe, với hai cột, tôi muốn groupby một cột và tham gia vào danh sách thuộc về cùng một nhóm, ví dụ:gấu trúc groupby và tham gia danh sách

column_a, column_b 
1,   [1,2,3] 
1,   [2,5] 
2,   [5,6] 

sau quá trình:

column_a, column_b 
1,   [1,2,3,2,5] 
2,   [5,6] 

Tôi muốn giữ tất cả các bản sao. Tôi có các câu hỏi sau:

  • Dtypes của khung dữ liệu là (các) đối tượng. convert_objects() không chuyển đổi column_b thành danh sách tự động. Tôi có thể làm cái này như thế nào?
  • chức năng nào trong df.groupby (...) áp dụng (lambda x: ...) áp dụng cho? hình thức x là gì? danh sách?
  • giải pháp cho vấn đề chính của tôi?

Xin cảm ơn trước.

Trả lời

18

object dtype là kiểu nhận dạng toàn bộ về cơ bản có nghĩa là không phải int, float, bool, datetime hoặc timedelta. Vì vậy, nó được lưu trữ chúng như là một danh sách. convert_objects cố gắng chuyển đổi một cột thành một trong những loại dtypes đó.

Bạn muốn

In [63]: df 
Out[63]: 
    a   b c 
0 1 [1, 2, 3] foo 
1 1  [2, 5] bar 
2 2  [5, 6] baz 


In [64]: df.groupby('a').agg({'b': 'sum', 'c': lambda x: ' '.join(x)}) 
Out[64]: 
     c    b 
a       
1 foo bar [1, 2, 3, 2, 5] 
2  baz   [5, 6] 

này nhóm khung dữ liệu bằng các giá trị trong cột a. Đọc thêm về [groupby]. (http://pandas.pydata.org/pandas-docs/stable/groupby.html).

này được thực hiện một danh sách thường xuyên sum (nối) giống như [1, 2, 3] + [2, 5]

+0

cảm ơn, tôi có một câu hỏi khác: nếu tôi có cột thứ ba là loại chuỗi và tôi muốn '' .join chúng theo nhóm của một cột. Tôi nên làm gì? –

+0

Chuỗi giống như danh sách các ký tự. Vì vậy, '.sum()' cũng nên làm việc ở đó. – TomAugspurger

+0

Có, nhưng tôi muốn một khoảng trắng ('khoảng trống') giữa mỗi chuỗi được nối. –

4
df.groupby('column_a').agg(sum) 

này hoạt động vì khai thác quá tải sum concatenates các danh sách với nhau. Chỉ số của kết quả df sẽ là các giá trị từ column_a:

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