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.