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

Важные注意事项 Pandas

Внимания и ловушки Pandas

Использование If/Truth в Pandas

При использовании булевых операторов if или when, or или or not, попытке преобразовать某些 данные в bool иногда возникает ошибка. Как именно происходит ошибка, в настоящее время неясно. Pandas вызывает исключение ValueError.

 import pandas as pd
 if pd.Series([False, True, False]):
    print 'Я есть True'

Результат выполнения:

 ValueError: Значение Series неопределенно. 
 Используйте a.empty, a.bool(), a.item(), a.any() или a.all().

В этом случае неясно, как обрабатывать. Эта ошибка暗示ает использование None или любого из них.

 import pandas as pd
 if pd.Series([False, True, False]).any():
    print("Я есть any")

Результат выполнения:

Я есть any

Чтобы оценить одиночный объект Pandas в булевом контексте, используйте метод .bool() -

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

Результат выполнения:

True

Булевые значения

Булевые операторы, такие как == и !, возвращает булевую серию, что почти всегда необходимо.

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

Результат выполнения:

 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

Результат выполнения:

 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']]

Результат выполнения:

        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

当然,在这种情况下,这完全等同于使用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'])

Результат выполнения:

        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

有人可能会得出结论,ix和reindex基于此是100%等效的。除了整数索引的情况外,都是如此。例如,上述操作可以代替地表示为:

 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])

Результат выполнения:

        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

Важно помнить, что повторное индексирование это всего лишь строгий индекс с метками. В случае, когда индекс содержит такие значения, как целые числа и строки, это может привести к некоторым неожиданным результатам.