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. Это может привести к некоторым потенциально неожиданным результатам в патологических случаях, когда индекс содержит, скажем, как целые числа, так и строки.