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

Précautions Pandas

Pandas 注意事项和陷阱

在Pandas中使用If/Truth语句

当您使用布尔运算符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

isin操作

这将返回一个布尔系列,显示布尔值中的每个元素是否完全包含在传递的值序列中。

 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

重建索引 vs ix索引

许多用户会发现自己使用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.