2013-07-31 50 views
5

Sử dụng gấu trúc 0.11 trên python 2.7.3 Tôi cố gắng để xoay một dataframe đơn giản với các giá trị sau:ReshapeError trong khi cố gắng xoay gấu trúc dataframe

StudentID QuestionID Answer DateRecorded 
0  1234  bar  a 2012/01/21 
1  1234  foo  c 2012/01/22 
2  4321  bop  a 2012/01/22 
3  5678  bar  a 2012/01/24 
4  8765  baz  b 2012/02/13 
5  4321  baz  b 2012/02/15 
6  8765  bop  b 2012/02/16 
7  5678  bop  c 2012/03/15 
8  5678  foo  a 2012/04/01 
9  1234  baz  b 2012/04/11 
10  8765  bar  a 2012/05/03 
11  4321  bar  a 2012/05/04 
12  5678  baz  c 2012/06/01 
13  1234  bar  b 2012/11/01 

Tôi đang sử dụng lệnh sau:

df.pivot(index='StudentID', columns='QuestionID') 

Nhưng tôi nhận được lỗi sau:

ReshapeError: Index contains duplicate entries, cannot reshape 

Lưu ý rằng dataframe cùng mà không có sự lin cuối cùng e

13  1234  bar  b 2012/11/01 

Kết quả trục thành công trong sau:

  Answer    DateRecorded          
QuestionID bar baz bop foo   bar   baz   bop   foo 
StudentID                  
1234   a b NaN c 2012/01/21 2012/04/11   NaN 2012/01/22 
4321   a b a NaN 2012/05/04 2012/02/15 2012/01/22   NaN 
5678   a c c a 2012/01/24 2012/06/01 2012/03/15 2012/04/01 
8765   a b b NaN 2012/05/03 2012/02/13 2012/02/16   NaN 

Tôi mới vào pivoting và muốn biết lý do tại sao có StudentID trùng lặp, QuestionID cặp gây ra vấn đề này? Và, làm thế nào tôi có thể sửa lỗi này bằng hàm df.pivot()?

cảm ơn bạn.

+0

Tôi đã thử các tính năng sau: http://stackoverflow.com/questions/13216087/pandas-dataframe-pivoting-issue, http://stackoverflow.com/questions/11232275/pandas-pivot-warning-about -repeated-entries-on-index và http://stackoverflow.com/questions/13216087/pandas-dataframe-pivoting-issue. Nhưng vấn đề vẫn còn đó. Ngoài ra, tôi không muốn một dataframe MultiIndexed overcomplicated trong kết quả. – iqbalnaved

Trả lời

5

Bạn mong đợi bảng tổng hợp của bạn trông như thế nào với các mục trùng lặp? Tôi không chắc chắn sẽ có ý nghĩa khi có nhiều phần tử cho (1234, thanh) trong bảng tổng hợp. Dữ liệu của bạn có vẻ như được lập chỉ mục tự nhiên bởi (questionID, studentID, dateRecorded).

Nếu bạn đi với cách tiếp cận phân cấp Index Tôi muốn thử (họ đang thực sự không phải là phức tạp!):

In [104]: df2 = df.set_index(['StudentID', 'QuestionID', 'DateRecorded']) 

In [105]: df2 
Out[105]: 
            Answer 
StudentID QuestionID DateRecorded  
1234  bar  2012/01/21  a 
      foo  2012/01/22  c 
4321  bop  2012/01/22  a 
5678  bar  2012/01/24  a 
8765  baz  2012/02/13  b 
4321  baz  2012/02/15  b 
8765  bop  2012/02/16  b 
5678  bop  2012/03/15  c 
      foo  2012/04/01  a 
1234  baz  2012/04/11  b 
8765  bar  2012/05/03  a 
4321  bar  2012/05/04  a 
5678  baz  2012/06/01  c 
1234  bar  2012/11/01  b 

In [106]: df2.unstack('QuestionID') 
Out[106]: 
         Answer    
QuestionID    bar baz bop foo 
StudentID DateRecorded      
1234  2012/01/21  a NaN NaN NaN 
      2012/01/22  NaN NaN NaN c 
      2012/04/11  NaN b NaN NaN 
      2012/11/01  b NaN NaN NaN 
4321  2012/01/22  NaN NaN a NaN 
      2012/02/15  NaN b NaN NaN 
      2012/05/04  a NaN NaN NaN 
5678  2012/01/24  a NaN NaN NaN 
      2012/03/15  NaN NaN c NaN 
      2012/04/01  NaN NaN NaN a 
      2012/06/01  NaN c NaN NaN 
8765  2012/02/13  NaN b NaN NaN 
      2012/02/16  NaN NaN b NaN 
      2012/05/03  a NaN NaN NaN 

Nếu không, bạn có thể đưa ra một số quy tắc để xác định của nhiều mục để lấy bảng tổng hợp và tránh chỉ mục Phân cấp.

+0

Cảm ơn bạn. Giải pháp của bạn là những gì tôi đang tìm kiếm. Chỉ có điều tôi cần là một cá thể duy nhất cho mỗi StudentID. Vì vậy, tôi nghĩ rằng cách duy nhất tôi có thể nhận được là tổng hợp trên cột DateRecorded bởi max(). – iqbalnaved

0

Thay vì dựa vào Pandas (dĩ nhiên là tốt hơn) bạn cũng có thể tổng hợp dữ liệu theo cách thủ công.

def heatmap_seaborn(): 
    na_lr_measures = [50, 50, 50, 49, 49, 49, 48, 47, 47, 47, 46, 46, 46, 46, 45, 45, 45, 45, 45, 45, 45, 45, 45, 43, 43, 43, 43, 42, 42, 42, 41, 41, 41, 41, 41, 41, 41, 40, 40, 40, 40, 40, 40, 40, 40, 39, 39, 37, 37, 36, 36, 36, 36, 35, 35, 35, 35, 35, 34, 34, 34, 33, 33, 33, 32, 32, 31, 30, 30, 30, 29, 29] 
    na_lr_labels = ('bi2e', 'bi21', 'bi22', 'si21', 'si22', 'si2e', 'si11', 'bi11', 'bi1e', 'si1e', 'bx21', 'ti22', 'bx2e', 'si12', 'ti1e', 'sx22', 'ti21', 'bx22', 'sx2e', 'bi12', 'ti11', 'sx21', 'ti2e', 'ti12', 'sx11', 'sx1e', 'bxx2', 'bx1e', 'bx11', 'tx2e', 'tx22', 'tx21', 'sx12', 'six1', 'six2', 'sixe', 'sixx', 'tx11', 'bx12', 'bix2', 'bix1', 'tx1e', 'bixe', 'bixx', 'bxxe', 'sxx2', 'tx12', 'tixe', 'tix1', 'sxxe', 'sxx1', 'si1x', 'tixx', 'bxx1', 'tix2', 'bi2x', 'sxxx', 'si2x', 'txx1', 'bxxx', 'txxe', 'ti2x', 'sx2x', 'bx2x', 'txxx', 'bi1x', 'tx1x', 'sx1x', 'tx2x', 'txx2', 'bx1x', 'ti1x') 
    na_lr_labelcategories = ["TF", "IDF", "Normalisation", "Regularisation", "[email protected]"] 


    measures = na_lr_measures 
    labels = na_lr_labels 
    cats = na_lr_labelcategories 


    new_measures = defaultdict(list) 
    new_labels = [] 
    #cats = ["TF", "Normalisation", "[email protected]"] 
    for i,c in enumerate(labels): 
     c=c[0]+c[2] 
     new_labels.append(c) 
     m = measures[i] 
     new_measures[c].append(m) 
    labels = list(set(new_labels)) 
    measures = [] 
    for l in labels: 
     m = np.mean(new_measures[l]) 
     measures.append(m) 





    df = pd.DataFrame(
        {cats[0]:pd.Categorical([a[0] for a in labels]), 
        #cats[1]:pd.Categorical([a[1] for a in labels]), 
        cats[2]:pd.Categorical([a[1] for a in labels]), 
        #cats[3]:pd.Categorical([a[3] for a in labels]), 
        cats[4]:measures}) 
    print df 


    df = df.pivot(cats[0], cats[2], cats[4]) 
    sns.set_context("paper",font_scale=2.7) 
    fig, ax = plt.subplots() 
    ax = sns.heatmap(df) 
    plt.show() 

như bạn có thể thấy trong ví dụ về khung dữ liệu gấu trúc được tạo từ một số mảng thì bảng được tổng hợp theo cách thủ công. Tôi đã làm điều này bởi vì tôi không có thời gian để tìm hiểu thêm gấu trúc.

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