Python Pandas - предостережения и подводные камни

Caveats означает предупреждение, а gotcha означает невидимую проблему.

Использование оператора If / Truth с пандами

Pandas следует соглашению о numpy, вызывая ошибку, когда вы пытаетесь преобразовать что-то в bool. Это происходит вif или же when используя логические операции, и or, или же not. Непонятно, каким должен быть результат. Должно ли это быть Истина, потому что это не нулевая длина? Ложь, потому что есть Ложные значения? Это неясно, поэтому вместо этого Pandas поднимаетValueError -

import pandas as pd

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

это output выглядит следующим образом -

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

В ifсостояние, непонятно что с ним делать. Ошибка указывает на то, следует ли использоватьNone или же any of those.

import pandas as pd

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

это output выглядит следующим образом -

I am any

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

import pandas as pd

print pd.Series([True]).bool()

это output выглядит следующим образом -

True

Побитовое логическое значение

Побитовые логические операторы, такие как == и != вернет логический ряд, который в любом случае почти всегда требуется.

import pandas as pd

s = pd.Series(range(5))
print s==4

это output выглядит следующим образом -

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

isin Operation

Это возвращает логический ряд, показывающий, точно ли каждый элемент в серии содержится в переданной последовательности значений.

import pandas as pd

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

это output выглядит следующим образом -

0 True
1 False
2 True
dtype: bool

Переиндексирование против ix Gotcha

Многие пользователи обнаружат, что используют ix indexing capabilities как краткое средство выбора данных из объекта 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']]

это output выглядит следующим образом -

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

это output выглядит следующим образом -

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

это output выглядит следующим образом -

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

Важно помнить, что reindex is strict label indexing only. Это может привести к некоторым потенциально неожиданным результатам в патологических случаях, когда индекс содержит, скажем, как целые числа, так и строки.