English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Considerações do Pandas

Pandas注意事项和陷阱

Using If in Pandas/Truth statement

Quando você usa operadores booleanos if ou when, or ou or not, tentando converter algum conteúdo para bool, às vezes ocorre um erro. A maneira como esse erro ocorre ainda não é clara. Pandas levantou uma exceção ValueError.

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

Os resultados da execução são os seguintes:

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

Neste caso, não está claro como lidar. Este erro sugere que está usando None ou qualquer um deles.

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

Os resultados da execução são os seguintes:

I am any

Para avaliar um objeto Pandas de um único elemento no contexto booleano, use o método .bool()-

import pandas as pd
print pd.Series([True]).bool()

Os resultados da execução são os seguintes:

True

Valores booleanos bit a bit

Operadores booleanos bit a bit como == e ! retornarão uma série booleana, o que quase sempre é necessário.

 import pandas as pd
 s = pd.Series(range(5))
 print s==4

Os resultados da execução são os seguintes:

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

Operação isin

Isso retornará uma série booleana que mostra se cada elemento do valor booleano está completamente contido na sequência de valores passada.

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

Os resultados da execução são os seguintes:

 0 True
 1 False
 2 True
 dtype: bool

Reconstrução de índice vs índice ix

Muitos usuários se encontram usando a função de índice ix como um método conciso para selecionar dados de objetos Pandas:

 import pandas as pd
 import numpy as np
 df = pd.DataFrame(np.random.randn(6, 4),  colunas=['one',  'two',  'three',
 'four'],index=list('abcdef'))
 print df
 print df.ix[['b', 'c', 'e']]

Os resultados da execução são os seguintes:

        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

Claro, neste caso, isso é completamente equivalente a usar o método reindex:

 import pandas as pd
 import numpy as np
 df = pd.DataFrame(np.random.randn(6, 4),  colunas=['one',  'two',  'three',
 'four'],index=list('abcdef'))
 print df
 print df.reindex(['b',  'c',  'e'])

Os resultados da execução são os seguintes:

        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

Alguém pode concluir que ix e reindex são baseados nisso10100% equivalente. Exceto para índices inteiros, é assim. Por exemplo, a operação acima pode ser expressa alternativamente como:

 import pandas as pd
 import numpy as np
 df = pd.DataFrame(np.random.randn(6, 4),  colunas=['one',  'two',  'three',
 'four'],index=list('abcdef'))
 print df
 print df.ix[[1, 2, 4])
 print df.reindex([1, 2, 4])

Os resultados da execução são os seguintes:

        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 a reindexação é apenas uma etiqueta de índice rigorosa. Em casos onde o índice contém, por exemplo, números inteiros e strings, isso pode levar a resultados inesperados.