Pandas Python - Mises en garde et Gotchas

Les mises en garde signifie avertissement et gotcha signifie un problème invisible.

Utilisation de la déclaration If / Truth avec les pandas

Pandas suit la convention numpy de générer une erreur lorsque vous essayez de convertir quelque chose en bool. Cela se produit dans unif ou when en utilisant les opérations booléennes, et, or, ou not. On ne sait pas quel devrait être le résultat. Doit-il être vrai parce que ce n'est pas une longueur nulle? False parce qu'il y a des valeurs False? Ce n'est pas clair, donc à la place, Pandas soulève unValueError -

import pandas as pd

if pd.Series([False, True, False]):
   print 'I am True'

Ses output est comme suit -

ValueError: The truth value of a Series is ambiguous. 
Use a.empty, a.bool() a.item(),a.any() or a.all().

Dans ifcondition, on ne sait pas quoi en faire. L'erreur suggère s'il faut utiliser unNone ou any of those.

import pandas as pd

if pd.Series([False, True, False]).any():
   print("I am any")

Ses output est comme suit -

I am any

Pour évaluer des objets pandas à un seul élément dans un contexte booléen, utilisez la méthode .bool() -

import pandas as pd

print pd.Series([True]).bool()

Ses output est comme suit -

True

Booléen au niveau du bit

Opérateurs booléens au niveau du bit comme == et != retournera une série booléenne, ce qui est presque toujours requis de toute façon.

import pandas as pd

s = pd.Series(range(5))
print s==4

Ses output est comme suit -

0 False
1 False
2 False
3 False
4 True
dtype: bool

isin Operation

Cela renvoie une série booléenne indiquant si chaque élément de la série est exactement contenu dans la séquence de valeurs transmise.

import pandas as pd

s = pd.Series(list('abc'))
s = s.isin(['a', 'c', 'e'])
print s

Ses output est comme suit -

0 True
1 False
2 True
dtype: bool

Réindexation vs ix Gotcha

De nombreux utilisateurs se retrouveront à utiliser le ix indexing capabilities comme moyen concis de sélectionner des données à partir d'un objet Pandas -

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(6, 4), columns=['one', 'two', 'three',
'four'],index=list('abcdef'))

print df
print df.ix[['b', 'c', 'e']]

Ses output est comme suit -

one        two      three       four
a   -1.582025   1.335773   0.961417  -1.272084
b    1.461512   0.111372  -0.072225   0.553058
c   -1.240671   0.762185   1.511936  -0.630920
d   -2.380648  -0.029981   0.196489   0.531714
e    1.846746   0.148149   0.275398  -0.244559
f   -1.842662  -0.933195   2.303949   0.677641

          one        two      three       four
b    1.461512   0.111372  -0.072225   0.553058
c   -1.240671   0.762185   1.511936  -0.630920
e    1.846746   0.148149   0.275398  -0.244559

Ceci est bien entendu tout à fait équivalent dans ce cas à l'utilisation du reindex méthode -

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(6, 4), columns=['one', 'two', 'three',
'four'],index=list('abcdef'))

print df
print df.reindex(['b', 'c', 'e'])

Ses output est comme suit -

one        two      three       four
a    1.639081   1.369838   0.261287  -1.662003
b   -0.173359   0.242447  -0.494384   0.346882
c   -0.106411   0.623568   0.282401  -0.916361
d   -1.078791  -0.612607  -0.897289  -1.146893
e    0.465215   1.552873  -1.841959   0.329404
f    0.966022  -0.190077   1.324247   0.678064

          one        two      three       four
b   -0.173359   0.242447  -0.494384   0.346882
c   -0.106411   0.623568   0.282401  -0.916361
e    0.465215   1.552873  -1.841959   0.329404

Certains pourraient conclure que ix et reindexsont 100% équivalents sur cette base. Ceci est vrai sauf dans le cas de l'indexation d'entiers. Par exemple, l'opération ci-dessus peut également être exprimée par -

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(6, 4), columns=['one', 'two', 'three',
'four'],index=list('abcdef'))

print df
print df.ix[[1, 2, 4]]
print df.reindex([1, 2, 4])

Ses output est comme suit -

one        two      three       four
a   -1.015695  -0.553847   1.106235  -0.784460
b   -0.527398  -0.518198  -0.710546  -0.512036
c   -0.842803  -1.050374   0.787146   0.205147
d   -1.238016  -0.749554  -0.547470  -0.029045
e   -0.056788   1.063999  -0.767220   0.212476
f    1.139714   0.036159   0.201912   0.710119

          one        two      three       four
b   -0.527398  -0.518198  -0.710546  -0.512036
c   -0.842803  -1.050374   0.787146   0.205147
e   -0.056788   1.063999  -0.767220   0.212476

    one  two  three  four
1   NaN  NaN    NaN   NaN
2   NaN  NaN    NaN   NaN
4   NaN  NaN    NaN   NaN

Il est important de se rappeler que reindex is strict label indexing only. Cela peut conduire à des résultats potentiellement surprenants dans les cas pathologiques où un index contient, par exemple, des entiers et des chaînes.