Pandas: Разница между точкой поворота и поворотным столом. Почему работает только pivot_table?

У меня есть следующий фрейм.

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

В соответствии с сводной документацией я должен иметь возможность изменить ее на имя score_type_name с помощью функции поворота.

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

Но я получаю следующее.

enter image description here

Однако функция pivot_table работает:

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

enter image description here

Но он не поддается, для меня, по крайней мере, дальнейшему анализу. Я хочу, чтобы просто иметь struct_id, resNum и score_type_name в качестве столбцов вместо укладки score_type_name поверх остальных столбцов. Кроме того, я хочу, чтобы struct_id была для каждой строки, а не объединялась в объединенную строку, как это делается для таблицы.

Так может кто-нибудь сказать мне, как я могу получить хороший Dataframe, как я хочу использовать pivot? Кроме того, из документации я не могу сказать, почему pivot_table работает, а pivot - нет. Если я посмотрю на первый пример стержня, он выглядит точно, что мне нужно.

P.S. Я задал вопрос в связи с этой проблемой, но я сделал такую ​​плохую работу по демонстрации вывода, я удалил ее и снова попытался использовать ipython-ноутбук. Приносим извинения заранее, если вы видите это дважды.

Вот ваш ноутбук для полной справки

EDIT - мои желаемые результаты будут выглядеть так (сделанные в 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 

Ответ 1

Я не уверен, что понимаю, но я попробую. Я обычно использую stack/unstack вместо pivot, это ближе к тому, что вы хотите?

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  

Я не уверен, почему ваш стержень не работает (вроде бы мне кажется, что это должно быть, но я могу ошибаться), но похоже, что он работает (или, по крайней мере, не дает ошибки), если я останусь 'struct_id. Конечно, это не очень полезное решение для полного набора данных, где у вас есть несколько разных значений для 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  

Изменить для добавления: reset_index() преобразует из многоиндексного (иерархического) в более плоский стиль. В именах столбцов все еще есть иерархия, иногда самый простой способ избавиться от них - это просто сделать df.columns=['var1','var2',...], хотя есть более сложные способы, если вы выполните некоторые поиски.

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   

Ответ 2

Для тех, кто все еще интересуется разницей между pivot и pivot_table, в основном существуют две отличия:

  • pivot_table является обобщением pivot, который может обрабатывать повторяющиеся значения для одной пары с поворотом index/column. В частности, вы можете дать pivot_table список функций агрегации, используя аргумент ключевого слова aggfunc. Значение по умолчанию aggfunc pivot_table равно numpy.mean.
  • pivot_table также поддерживает использование нескольких столбцов для индекса и столбца таблицы с поворотом. Иерархический индекс будет автоматически сгенерирован для вас.

REF: pivot и pivot_table

Ответ 3

Я немного отлаживал его.

  • DataFrame.pivot() и DataFrame.pivot_table() отличаются.
  • pivot() не принимает список для индекса.
  • pivot_table() принимает.

Внутри, оба из них используют функцию reset_index()/stack()/unstack() для выполнения задания.

pivot() - это просто сокращение для простого использования, я думаю.

Ответ 4

Другая оговорка:

pivot_table будет разрешать только числовые типы как "values ​​=", тогда как pivot будет принимать типы строк как "values ​​=".

Ответ 5

Чтобы получить фрейм данных, полученный из вызова pivot_table, в нужном формате:

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

Ответ 6

pivot() используется для поворота без агрегирования. Поэтому он не может иметь дело с дублирующимися значениями для одной пары индекс/столбец.

Так как здесь ваш index=['struct_id','resNum'] имеет несколько дубликатов, следовательно, pivot не работает.

Однако pivot_table будет работать, потому что он будет обрабатывать дублирующиеся значения путем их агрегирования.

Ответ 7

Данный фрагмент может помочь вам в дальнейшем выравнивании внешнего вида вашего фрейма данных

df.set_index(['struct_id','resNum','score_type_name']).unstack().reset_index()
df.loc[:,['struct_id','resNum','fa_dun','fa_dun_dev','fa_dun_rot']]

Ответ 8

Перед вызовом сводной таблицы необходимо убедиться, что в наших данных нет строк с повторяющимися значениями для указанных столбцов.

Пивот с дубликатом дают

Index contains duplicate entries, cannot reshape

Если мы не можем этого гарантировать, нам, возможно, придется использовать метод pivot_table.

Пожалуйста, найдите ссылку ниже для более подробного объяснения

https://nikgrozev.com/2015/07/01/reshaping-in-pandas-pivot-pivot-table-stack-and-unstack-explained-with-pictures/