Python Pandas - Advertencias y errores

Advertencias significa advertencia y atrapados significa un problema invisible.

Uso de If / Truth Statement con Pandas

Pandas sigue la convención numpy de generar un error cuando intentas convertir algo en un bool. Esto sucede en unif o when usando las operaciones booleanas, y, oro not. No está claro cuál debería ser el resultado. ¿Debería ser verdadero porque no es de longitud cero? ¿Falso porque hay valores falsos? No está claro, por lo que en su lugar, Pandas plantea unValueError -

import pandas as pd

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

Sus output es como sigue -

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

En ifcondición, no está claro qué hacer con ella. El error sugiere si se debe utilizar unNone o any of those.

import pandas as pd

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

Sus output es como sigue -

I am any

Para evaluar objetos pandas de un solo elemento en un contexto booleano, use el método .bool() -

import pandas as pd

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

Sus output es como sigue -

True

Booleano bit a bit

Operadores booleanos bit a bit como == y != devolverá una serie booleana, que es casi siempre lo que se requiere de todos modos.

import pandas as pd

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

Sus output es como sigue -

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

está en operación

Esto devuelve una serie booleana que muestra si cada elemento de la serie está contenido exactamente en la secuencia de valores pasada.

import pandas as pd

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

Sus output es como sigue -

0 True
1 False
2 True
dtype: bool

Reindexar vs ix Gotcha

Muchos usuarios se encontrarán usando el ix indexing capabilities como un medio conciso de seleccionar datos de un objeto 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']]

Sus output es como sigue -

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

Esto es, por supuesto, completamente equivalente en este caso a usar el reindex método -

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'])

Sus output es como sigue -

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

Algunos podrían concluir que ix y reindexson 100% equivalentes en base a esto. Esto es cierto excepto en el caso de la indexación de enteros. Por ejemplo, la operación anterior se puede expresar alternativamente como:

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])

Sus output es como sigue -

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

Es importante recordar que reindex is strict label indexing only. Esto puede conducir a algunos resultados potencialmente sorprendentes en casos patológicos donde un índice contiene, digamos, tanto enteros como cadenas.