web-dev-qa-db-fra.com

Pandas: Différence entre pivot et pivot_table. Pourquoi seul pivot_table fonctionne?

J'ai le dataframe suivant. 

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

Selon la documentation de pivot, je devrais être en mesure de remodeler ceci sur le nom score_type_name en utilisant la fonction pivot. 

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

Mais je comprends ce qui suit. 

enter image description here

Cependant, la fonction pivot_table semble fonctionner:

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

enter image description here

Mais cela ne se prête pas, du moins pour moi, à une analyse plus poussée. Je veux simplement que struct_id, resNum et score_type_name soient utilisés comme colonnes au lieu d'empiler score_type_name par-dessus les autres colonnes. De plus, je veux que struct_id soit pour chaque ligne et non pas agrégé dans une ligne jointe comme il le fait pour la table.

Quelqu'un peut-il me dire comment obtenir un Nice Dataframe comme je le souhaite à l'aide de pivot? De plus, dans la documentation, je ne peux pas dire pourquoi pivot_table fonctionne et pivot non. Si je regarde le premier exemple de pivot, cela ressemble exactement à ce dont j'ai besoin.

P.S. J'ai posté une question à propos de ce problème, mais j’ai fait un si mauvais travail de démonstration du résultat, je l’ai effacé et j’ai réessayé avec ipython notebook. Je m'excuse par avance si vous voyez cela deux fois. 

Voici le cahier pour votre référence complète

EDIT - Mes résultats souhaités ressembleraient à ceci (fabriqué dans 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 
25
jwillis0720

Pour ceux qui sont toujours intéressés par la différence entre pivot et pivot_table, il y a principalement deux différences:

  • pivot_table est une généralisation de pivot pouvant gérer les valeurs en double pour une paire index/colonne pivotée. Plus précisément, vous pouvez donner à pivot_table une liste de fonctions d'agrégation à l'aide du mot clé argument aggfunc. La aggfunc par défaut de pivot_table est numpy.mean.
  • pivot_table prend également en charge l'utilisation de plusieurs colonnes pour l'index et la colonne de la table pivoted. Un index hiérarchique sera automatiquement généré pour vous.

REF: pivot et pivot_table

40
Tanachat

Je l'ai débogué un peu. 

  • Les DataFrame.pivot () et DataFrame.pivot_table () sont différents. 
  • pivot () n'accepte pas de liste pour l'index. 
  • pivot_table () accepte.

En interne, tous les deux utilisent reset_index ()/stack ()/unstack () pour effectuer le travail.

pivot () est juste un raccourci pour une utilisation simple, je pense. 

5
Day.ong Li

Une autre mise en garde: 

pivot_table n'autorisera les types numériques que "values ​​=", alors que pivot acceptera les types de chaîne sous la forme "valeurs =".

4
Kevin Glynn

Pour obtenir le cadre de données que vous avez obtenu à partir de l'appel pivot_table au format souhaité:

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

L'extrait donné peut vous aider à affiner l'apparence de votre cadre de données.

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']]
0
Asif Khan

Avant d'appeler pivot, nous devons nous assurer que nos données ne contiennent pas de lignes avec des valeurs en double pour les colonnes spécifiées

Pivot avec duplicata donne

Index contains duplicate entries, cannot reshape

Si nous ne pouvons pas nous en assurer, nous devrons peut-être utiliser la méthode pivot_table à la place.

Veuillez trouver le lien ci-dessous pour une explication plus détaillée 

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

0
Dheeraj