2016-10-25 70 views
9

Câu hỏi

Có hai câu hỏi mà trông tương tự nhưng họ không phải là cùng một câu hỏi: herehere. Cả hai đều gọi một phương thức là GroupBy, chẳng hạn như count() hoặc aggregate(), mà tôi biết trả về DataFrame. Những gì tôi yêu cầu là làm thế nào để chuyển đổi các đối tượng GroupBy (lớp pandas.core.groupby.DataFrameGroupBy) chính nó thành một DataFrame. Tôi sẽ minh họa bên dưới.Python Pandas chuyển đổi đối tượng groupby để DataFrame

Ví dụ

Tạo ví dụ DataFrame như sau.

data_list = [] 
for name in ["sasha", "asa"]: 
    for take in ["one", "two"]: 
     row = {"name": name, "take": take, "score": numpy.random.rand(), "ping": numpy.random.randint(10, 100)} 
     data_list.append(row) 
data = pandas.DataFrame(data_list) 

Ở trên DataFrame sẽ giống như sau (với các số khác nhau rõ ràng).

name ping  score take 
0 sasha 72 0.923263 one 
1 sasha 14 0.724720 two 
2 asa 76 0.774320 one 
3 asa 71 0.128721 two 

Những gì tôi muốn làm là vào nhóm bởi các cột "Tên" và "mất" (theo thứ tự đó), vì vậy mà tôi có thể nhận được một DataFrame lập chỉ mục của multiindex xây dựng từ các cột "Tên" và "lấy", như dưới đây.

   score ping 
name take   
sasha one 0.923263 72 
     two 0.724720 14 
    asa one 0.774320 76 
     two 0.128721 71 

Làm cách nào để đạt được điều đó? Nếu tôi làm grouped = data.groupby(["name", "take"]), thì grouped là một ví dụ pandas.core.groupby.DataFrameGroupBy. Làm cách nào để chuyển đổi grouped thành một phiên bản DataFrame?

Trả lời

7

Bạn cần set_index:

data = data.set_index(['name','take']) 
print (data) 
      ping  score 
name take     
sasha one  46 0.509177 
     two  77 0.828984 
asa one  51 0.637451 
     two  51 0.658616 
+0

Oooooh !!!! Riiiiiight !!!!! OK Tôi sẽ chấp nhận câu trả lời này sau 9 phút khi Stack Overflow cho phép tôi. Cảm ơn bạn. – Ray

+0

Khi tôi cố gắng sử dụng câu trả lời này, tôi nhận được một 'AttributeError'. "Không thể truy cập thuộc tính có thể gọi 'set_index' của đối tượng 'DataFrameGroupBy', hãy thử sử dụng phương thức 'áp dụng'" – Nate

+1

@Nate - Có vẻ như 'dữ liệu' không phải là' DataFrame', nhưng đầu ra của nhóm - vì vậy cần 'g = df.groupby ('col') 'và sau đó' g.apply (lambda x: x ['col1']. set_index()) ' – jezrael

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