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.