English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Pandas 注意事项和陷阱
当您使用布尔运算符if或when,or或or not,尝试将某些内容转换为bool时,有时会引发一个错误。错误是怎么发生的目前尚不清楚。Pandas提出了一个ValueError异常。
import pandas as pd if pd.Series([False, True, False]): print 'I am True'
Les résultats du lancement sont les suivants :
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
在这种情况下,不清楚该怎么处理。这个错误暗示了是使用None或是其中任何一个。
import pandas as pd if pd.Series([False, True, False]).any(): print("I am any")
Les résultats du lancement sont les suivants :
I am any
要在布尔上下文中评估单元素Pandas对象,请使用.bool()方法-
import pandas as pd print pd.Series([True]).bool()
Les résultats du lancement sont les suivants :
True
像==和!之类的按位布尔运算符=将返回一个布尔序列,这几乎总是需要的。
import pandas as pd s = pd.Series(range(5)) print s==4
Les résultats du lancement sont les suivants :
0 False 1 False 2 False 3 False 4 True dtype: bool
这将返回一个布尔系列,显示布尔值中的每个元素是否完全包含在传递的值序列中。
import pandas as pd s = pd.Series(list('abc')) s = s.isin(['a', 'c', 'e']) print s
Les résultats du lancement sont les suivants :
0 True 1 False 2 True dtype: bool
许多用户会发现自己使用ix索引功能作为从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']]
Les résultats du lancement sont les suivants :
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
Bien sûr, dans ce cas, cela équivaut complètement à utiliser la méthode reindex :
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'])
Les résultats du lancement sont les suivants :
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
Quelqu'un pourrait conclure que ix et reindex sont basés sur ce10100% équivalent. Sauf pour les indices entiers, c'est ainsi. Par exemple, l'opération ci-dessus peut être représentée de manière alternative ainsi :
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])
Les résultats du lancement sont les suivants :
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
Il est important de se souvenir que le réindexage n'est qu'un indexage strict des étiquettes. En cas d'index contenant des entiers et des chaînes de caractères, cela peut entraîner des résultats imprévus.