2013-10-05 42 views
8

tôi nhóm lại dataframe của tôi bằng hai cột dưới đâyCách chọn các cột từ đối tượng groupby trong gấu trúc?

df = pd.DataFrame({'a': [1, 1, 3], 
        'b': [4.0, 5.5, 6.0], 
        'c': [7L, 8L, 9L], 
        'name': ['hello', 'hello', 'foo']}) 
df.groupby(['a', 'name']).median() 

và kết quả là:

  b c 
a name    
1 hello 4.75 7.5 
3 foo 6.00 9.0 

Làm thế nào tôi có thể truy cập vào name lĩnh vực trung bình kết quả (trong trường hợp này hello, foo)? Điều này không thành công:

df.groupby(['a', 'name']).median().name 

Trả lời

10

Bạn cần nhận giá trị chỉ mục, chúng không phải là cột. Trong trường hợp này mức 1

df.groupby(["a", "name"]).median().index.get_level_values(1) 

Out[2]: 

Index([u'hello', u'foo'], dtype=object) 

Bạn cũng có thể vượt qua các tên index

df.groupby(["a", "name"]).median().index.get_level_values('name') 

vì điều này sẽ được trực quan hơn thông qua các giá trị số nguyên.

Bạn có thể chuyển đổi các giá trị chỉ số vào một danh sách bằng cách gọi tolist()

df.groupby(["a", "name"]).median().index.get_level_values(1).tolist() 

Out[5]: 

['hello', 'foo'] 
+0

Nếu mức có một cái tên thì bạn có thể truy cập nó bằng tên đó là hơi rõ ràng hơn bởi chỉ số số. 'index.get_level_values ​​('name')'. –

+0

@PhillipCloud Vâng, tôi quên rằng bạn cũng có thể làm điều đó, tôi lười biếng khi gõ. Tôi sẽ cập nhật câu trả lời – EdChum

0

Bạn cũng có thể reset_index() trên kết quả groupby của bạn để lấy lại một dataframe với cột tên tại tiếp cận.

import pandas as pd 
df = pd.DataFrame({"a":[1,1,3], "b":[4,5.5,6], "c":[7,8,9], "name":["hello","hello","foo"]}) 
df_grouped = df.groupby(["a", "name"]).median() 
df_grouped.name 
0 hello 
1  foo 
Name: name, dtype: object 

Nếu bạn thực hiện một thao tác trên một cột duy nhất sự trở lại sẽ là một series với multiindex và bạn chỉ có thể áp dụng pd.DataFrame để nó và sau đó reset_index.

5

Set as_index = False trong groupby

df = pandas.DataFrame({"a":[1,1,3], "b":[4,5.5,6], "c":[7,8,9], "name":["hello","hello","foo"]}) 
df.groupby(["a", "name"] , as_index = False).median() 
Các vấn đề liên quan