English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Pandas注意事项和陷阱
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
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
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
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.