2012-08-15 39 views
6

Trong một ý nghĩa chung, vấn đề tôi đang tìm cách giải quyết đang thay đổi một thành phần của chỉ mục đa cấp thành các cột. Tức là, tôi có một số Series có chứa chỉ mục đa cấp và tôi muốn mức thấp nhất của chỉ mục được thay đổi thành các cột trong một dataframe. Đây là thực tế dụ vấn đề tôi đang cố gắng để giải quyết,Chỉ mục MultiLevel cho các cột: nhận giá trị_counts như các cột trong gấu trúc

Ở đây chúng ta có thể tạo ra một số dữ liệu mẫu:

foo_choices = ["saul", "walter", "jessee"] 
bar_choices = ["alpha", "beta", "foxtrot", "gamma", "hotel", "yankee"] 

df = DataFrame([{"foo":random.choice(foo_choices), 
       "bar":random.choice(bar_choices)} for _ in range(20)]) 
df.head() 

mà cho chúng ta,

 bar  foo 
0 beta jessee 
1 gamma jessee 
2 hotel saul 
3 yankee walter 
4 yankee jessee 
... 

Bây giờ, tôi có thể groupby bar và nhận được value_counts của trường foo,

dfgb = df.groupby('foo') 
dfgb['bar'].value_counts() 

và nó kết quả đầu ra,

foo    
jessee hotel  4 
     gamma  2 
     yankee  1 
saul foxtrot 3 
     hotel  2 
     gamma  1 
     alpha  1 
walter hotel  2 
     gamma  2 
     foxtrot 1 
     beta  1 

Nhưng những gì tôi muốn là một cái gì đó như thế nào,

  hotel beta foxtrot alpha gamma yankee 
foo       
jessee  1  1  5   4  1  1 
saul  0  3  0   0  1  0 
walter  1  0  0   1  1  0 

Giải pháp của tôi là để viết các bit sau:

for v in df['bar'].unique(): 
    if v is np.nan: continue 
    df[v] = np.nan 
    df.ix[df['bar'] == v, v] = 1 

dfgb = df.groupby('foo') 
dfgb.count()[df['bar'].unique()] 

Trả lời

9

Tôi nghĩ rằng bạn muốn:

dfgb['bar'].value_counts().unstack().fillna(0.) 
+0

THANK BẠN! Trường hợp có 'unstack' được ẩn? – milkypostman

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