Python Pandas - advertências e truques

Advertências significa aviso e pegadinha significa um problema invisível.

Usando a declaração If / Truth com os Pandas

O Pandas segue a convenção entorpecida de gerar um erro quando você tenta converter algo em um bool. Isso acontece em umif ou when usando as operações booleanas, e, or, ou not. Não está claro qual deve ser o resultado. Deve ser Verdadeiro porque não é comprimento zero? False porque existem valores False? Não está claro, então, em vez disso, o Pandas levanta umValueError -

import pandas as pd

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

Está output é o seguinte -

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

Dentro ifcondição, não está claro o que fazer com ele. O erro sugere se deve ser usado umNone ou any of those.

import pandas as pd

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

Está output é o seguinte -

I am any

Para avaliar objetos pandas de elemento único em um contexto booleano, use o método .bool() -

import pandas as pd

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

Está output é o seguinte -

True

Booleano bit a bit

Operadores booleanos bit a bit como == e != retornará uma série Booleana, que quase sempre é o que é necessário de qualquer maneira.

import pandas as pd

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

Está output é o seguinte -

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

está em operação

Isso retorna uma série booleana mostrando se cada elemento na série está contido exatamente na sequência de valores passada.

import pandas as pd

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

Está output é o seguinte -

0 True
1 False
2 True
dtype: bool

Reindexando vs ix Gotcha

Muitos usuários se verão usando o ix indexing capabilities como um meio conciso de selecionar dados de um 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']]

Está output é o seguinte -

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

Isso é, obviamente, completamente equivalente, neste caso, a usar o 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'])

Está output é o seguinte -

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

Alguns podem concluir que ix e reindexsão 100% equivalentes com base nisso. Isso é verdade, exceto no caso de indexação de inteiros. Por exemplo, a operação acima pode alternativamente ser expressa 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])

Está output é o seguinte -

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

É importante lembrar que reindex is strict label indexing only. Isso pode levar a alguns resultados potencialmente surpreendentes em casos patológicos em que um índice contém, digamos, inteiros e strings.