2015-06-21 13 views
13

Tôi có khung dữ liệu sau.Pandas: Sự khác biệt giữa pivot và pivot_table. Tại sao chỉ pivot_table hoạt động?

df.head(30) 

    struct_id resNum score_type_name score_value 
0 4294967297  1   omega  0.064840 
1 4294967297  1   fa_dun  2.185618 
2 4294967297  1  fa_dun_dev  0.000027 
3 4294967297  1  fa_dun_semi  2.185591 
4 4294967297  1    ref -1.191180 
5 4294967297  2   rama -0.795161 
6 4294967297  2   omega  0.222345 
7 4294967297  2   fa_dun  1.378923 
8 4294967297  2  fa_dun_dev  0.028560 
9 4294967297  2  fa_dun_rot  1.350362 
10 4294967297  2   p_aa_pp -0.442467 
11 4294967297  2    ref  0.249477 
12 4294967297  3   rama  0.267443 
13 4294967297  3   omega  0.005106 
14 4294967297  3   fa_dun  0.020352 
15 4294967297  3  fa_dun_dev  0.025507 
16 4294967297  3  fa_dun_rot -0.005156 
17 4294967297  3   p_aa_pp -0.096847 
18 4294967297  3    ref  0.979644 
19 4294967297  4   rama -1.403292 
20 4294967297  4   omega  0.212160 
21 4294967297  4   fa_dun  4.218029 
22 4294967297  4  fa_dun_dev  0.003712 
23 4294967297  4  fa_dun_semi  4.214317 
24 4294967297  4   p_aa_pp -0.462765 
25 4294967297  4    ref -1.960940 
26 4294967297  5   rama -0.600053 
27 4294967297  5   omega  0.061867 
28 4294967297  5   fa_dun  3.663050 
29 4294967297  5  fa_dun_dev  0.004953 

Theo tài liệu xoay vòng, tôi sẽ có thể định hình lại điều này trên score_type_name bằng cách sử dụng chức năng xoay vòng.

df.pivot(columns='score_type_name',values='score_value',index=['struct_id','resNum']) 

Nhưng, tôi hiểu như sau.

enter image description here

Tuy nhiên, chức năng pivot_table dường như làm việc:

pivoted = df.pivot_table(columns='score_type_name', 
         values='score_value', 
         index=['struct_id','resNum']) 

enter image description here

Nhưng nó không thích hợp, đối với tôi ít nhất, để phân tích thêm. Tôi muốn nó chỉ có struct_id, resNum và score_type_name làm cột thay vì xếp score_type_name ở đầu các cột khác. Ngoài ra, tôi muốn struct_id được cho mỗi hàng, và không tổng hợp trong một hàng gia nhập như nó cho bảng.

Vì vậy, bất kỳ ai cũng có thể cho tôi biết cách tôi có thể nhận được một Biểu dữ liệu đẹp như tôi muốn sử dụng trục xoay? Ngoài ra, từ tài liệu, tôi không thể biết tại sao pivot_table hoạt động và trục không. Nếu tôi nhìn vào ví dụ đầu tiên của trục, nó trông giống như những gì tôi cần.

P.S. Tôi đã đăng một câu hỏi liên quan đến vấn đề này, nhưng tôi đã làm một công việc nghèo như vậy chứng tỏ đầu ra, tôi đã xóa nó và thử lại bằng cách sử dụng sổ ghi chép ipython. Tôi xin lỗi trước nếu bạn thấy điều này hai lần.

Here is the notebook for your full reference

EDIT - kết quả của tôi mong muốn sẽ giống như thế này (thực hiện trong excel):

StructId resNum pdb_residue_number chain_id name3 fa_dun fa_dun_dev fa_dun_rot fa_dun_semi omega p_aa_pp rama ref 
4294967297 1 99 A ASN 2.1856 0.0000  2.1856 0.0648   -1.1912 
4294967297 2 100 A MET 1.3789 0.0286 1.3504  0.2223 -0.4425 -0.7952 0.2495 
4294967297 3 101 A VAL 0.0204 0.0255 -0.0052  0.0051 -0.0968 0.2674 0.9796 
4294967297 4 102 A GLU 4.2180 0.0037  4.2143 0.2122 -0.4628 -1.4033 -1.9609 
4294967297 5 103 A GLN 3.6630 0.0050  3.6581 0.0619 -0.2759 -0.6001 -1.5172 
4294967297 6 104 A MET 1.5175 0.2206 1.2968  0.0504 -0.3758 -0.7419 0.2495 
4294967297 7 105 A HIS 3.6987 0.0184  3.6804 0.0547 0.4019 -0.1489 0.3883 
4294967297 8 106 A THR 0.1048 0.0134 0.0914  0.0003 -0.7963 -0.4033 0.2013 
4294967297 9 107 A ASP 2.3626 0.0005  2.3620 0.0521 0.1955 -0.3499 -1.6300 
4294967297 10 108 A ILE 1.8447 0.0270 1.8176  0.0971 0.1676 -0.4071 1.0806 
4294967297 11 109 A ILE 0.1276 0.0092 0.1183  0.0208 -0.4026 -0.0075 1.0806 
4294967297 12 110 A SER 0.2921 0.0342 0.2578  0.0342 -0.2426 -1.3930 0.1654 
4294967297 13 111 A LEU 0.6483 0.0019 0.6464  0.0845 -0.3565 -0.2356 0.7611 
4294967297 14 112 A TRP 2.5965 0.1507  2.4457 0.5143 -0.1370 -0.5373 1.2341 
4294967297 15 113 A ASP 2.6448 0.1593   0.0510  -0.5011 
+0

Không chắc, nhưng tôi nghĩ rằng 'pivot' v' pivot_table' vấn đề có thể có để làm với mục index không duy nhất.. – tegancp

+0

Tôi chạy vào một vấn đề tương tự và, trong ngắn hạn, tôi cuối cùng nhận ra có quá nhiều mục nan trong cột tôi muốn sử dụng làm chỉ mục. Để xây dựng, tôi lặp lại thông qua khung dữ liệu của tôi cho tính duy nhất, nhưng nó bỏ qua các mục nan để vấn đề bay ngay dưới radar của tôi. – timctran

+0

Tôi đã viết tiêu chuẩn này có thể hữu ích. https://stackoverflow.com/q/47152691/2336654 – piRSquared

Trả lời

4

Tôi không chắc là tôi hiểu, nhưng tôi sẽ cho nó một thử. Tôi thường sử dụng stack/unstack thay vì pivot, điều này gần hơn với những gì bạn muốn?

df.set_index(['struct_id','resNum','score_type_name']).unstack() 

        score_value            
score_type_name  fa_dun fa_dun_dev fa_dun_rot fa_dun_semi  omega 
struct_id resNum               
4294967297 1   2.185618 0.000027  NaN 2.185591 0.064840 
      2   1.378923 0.028560 1.350362   NaN 0.222345 
      3   0.020352 0.025507 -0.005156   NaN 0.005106 
      4   4.218029 0.003712  NaN 4.214317 0.212160 
      5   3.663050 0.004953  NaN   NaN 0.061867 


score_type_name  p_aa_pp  rama  ref 
struct_id resNum         
4294967297 1   NaN  NaN -1.191180 
      2  -0.442467 -0.795161 0.249477 
      3  -0.096847 0.267443 0.979644 
      4  -0.462765 -1.403292 -1.960940 
      5   NaN -0.600053  NaN 

Tôi không chắc chắn lý do tại sao trục của bạn không hoạt động (kinda vẻ như với tôi như nó nên, nhưng tôi có thể là sai), nhưng nó dường như làm việc (hoặc ít nhất là không đưa ra một thông báo lỗi) nếu tôi rời khỏi 'struct_id'. Tất nhiên, đó không thực sự là giải pháp hữu ích cho tập dữ liệu đầy đủ mà bạn có nhiều giá trị khác nhau cho 'struct_id'.

df.pivot(columns='score_type_name',values='score_value',index='resNum') 

score_type_name fa_dun fa_dun_dev fa_dun_rot fa_dun_semi  omega 
resNum                  
1    2.185618 0.000027   NaN  2.185591 0.064840 
2    1.378923 0.028560 1.350362   NaN 0.222345 
3    0.020352 0.025507 -0.005156   NaN 0.005106 
4    4.218029 0.003712   NaN  4.214317 0.212160 
5    3.663050 0.004953   NaN   NaN 0.061867 

score_type_name p_aa_pp  rama  ref 
resNum           
1      NaN  NaN -1.191180 
2    -0.442467 -0.795161 0.249477 
3    -0.096847 0.267443 0.979644 
4    -0.462765 -1.403292 -1.960940 
5      NaN -0.600053  NaN 

Chỉnh sửa để thêm:reset_index() sẽ chuyển đổi từ một đa-index (thứ bậc) với một phong cách phẳng hơn. Vẫn còn một số thứ bậc trong các tên cột, đôi khi cách dễ nhất để loại bỏ chúng là chỉ làm df.columns=['var1','var2',...] mặc dù có nhiều cách phức tạp hơn nếu bạn thực hiện một số tìm kiếm.

df.set_index(['struct_id','resNum','score_type_name']).unstack().reset_index()

    struct_id resNum score_value        
score_type_name       fa_dun fa_dun_dev fa_dun_rot 
0    4294967297  1 2.185618 0.000027  NaN 
1    4294967297  2 1.378923 0.028560 1.350362 
2    4294967297  3 0.020352 0.025507 -0.005156 
3    4294967297  4 4.218029 0.003712  NaN 
4    4294967297  5 3.663050 0.004953  NaN 
+0

Việc xếp chồng giúp, nhưng tôi vẫn cần nó như đầu ra mong muốn của tôi, vì vậy tôi thực sự có thể tham gia công cụ với nó. Tôi dường như không thể làm việc với các khung dữ liệu lớp. – jwillis0720

+0

Có, reset_index giúp. Tôi sẽ đánh dấu điều này sớm nếu không ai có thể cho tôi biết lý do tại sao trục không hoạt động. Cảm ơn! – jwillis0720

+0

@ jwillis0720 Chắc chắn, không sao cả. Tôi tò mò quá nếu có ai có thể giải thích vấn đề với trục! – JohnE

3

Để có được dataframe bạn thu được từ pivot_table cuộc gọi sang định dạng bạn muốn:

pivoted.columns.name=None ## remove the score_type_name 
result = pivoted.reset_index() ## puts index columns back into dataframe body 
4

tôi sửa lỗi nó một chút.

  • DataFrame.pivot() và DataFrame.pivot_table() khác nhau.
  • pivot() không chấp nhận danh sách cho chỉ mục.
  • pivot_table() chấp nhận.

Nội bộ, cả hai đều đang sử dụng reset_index()/stack()/unstack() để thực hiện công việc.

trục xoay() chỉ là một đoạn cắt ngắn để sử dụng đơn giản, tôi nghĩ vậy.

2

Một caveat:

pivot_table sẽ chỉ cho phép các loại số như "giá trị =", trong khi pivot sẽ mất các loại chuỗi như "giá trị =".

10

Đối với những ai vẫn còn quan tâm đến sự khác biệt giữa pivotpivot_table, có chủ yếu là hai sự khác biệt:

  • pivot_table là một sự tổng quát của pivot có thể xử lý các giá trị trùng lặp cho một xoay index/cột đôi . Cụ thể, bạn có thể cung cấp cho pivot_table danh sách các hàm tổng hợp bằng cách sử dụng đối số từ khóa aggfunc. Mặc định aggfunc của pivot_tablenumpy.mean.
  • pivot_table cũng hỗ trợ sử dụng nhiều cột cho chỉ mục và cột của bảng được xoay vòng. Chỉ mục phân cấp sẽ được tạo tự động cho bạn.

REF: pivotpivot_table

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