2017-02-02 32 views
7

Tôi đang cố gắng sử dụng nhóm theo để tạo một khung dữ liệu mới, nhưng tôi cần chỉ mục đa để nhất quán. Bất kể loại phụ tồn tại, tôi muốn nó được tạo ra như sau:Pandas Groupby Mức nhất quán ngay cả khi trống

import pandas as pd 

df = pd.DataFrame(
    {'Cat 1':['A','A','A','B','B','B','B','C','C','C','C','C','D'], 
    'Cat 2':['A','B','A','B','B','B','A','B','B','B','B','B','A'], 
    'Num': [1,1,1,1,1,1,1,1,1,1,1,1,1]}) 
print df.groupby(['Cat 1','Cat 2']).sum() 

Với đầu ra trông giống như:

   Num 
Cat 1 Cat 2  
A  A  2 
     B  1 
B  A  1 
     B  3 
C  B  5 
D  A  1 

Nhưng tôi muốn nó trông giống như

   Num 
Cat 1 Cat 2  
A  A  2 
     B  1 
B  A  1 
     B  3 
C  A  Nan 
     B  5 
D  A  1 
     B  Nan 

tôi đọc dữ liệu khác nhau mà sau đó bổ sung thêm một cột trong định dạng này nên các mảng kết quả sẽ giống như thế:

   Num  Num_added_later 
Cat 1 Cat 2     
A  A  2   12 
     B  1   5 
B  A  1   5 
     B  3   3 
C  A  Nan  5 
     B  5   5 
D  A  1   1 
     B  Nan  3 

Trả lời

5

Bạn có thể tạo một chỉ số mới dựa trên Cát hai cột và reindex kết quả của bạn:

import pandas as pd 
new_index = pd.MultiIndex.from_product([df["Cat 1"].unique(), df["Cat 2"].unique()], names = ["Cat 1", "Cat 2"]) 

df.groupby(['Cat 1','Cat 2']).sum().reindex(new_index) 

enter image description here

4

Đây là một hack1! Vui lòng sử dụng @ câu trả lời Psidom của

df.groupby(['Cat 1','Cat 2']).sum().unstack().stack(dropna=False) 

      Num 
Cat 1 Cat 2  
A  A  2.0 
     B  1.0 
B  A  1.0 
     B  3.0 
C  A  NaN 
     B  5.0 
D  A  1.0 
     B  NaN 

Ok, có lẽ ít một hack nhưng ...

enter image description here

+3

Tôi không nghĩ rằng đây là rất hacky. Ý định không được truyền đạt là tốt, nhưng nó khá thông minh dù sao. –

+1

Tôi thích bản hack này! – MaxU

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