Я почти ничего не знаю о pandas
, но, используя ваш вопрос в качестве учебного упражнения, я обнаружил следующую закономерность.Когда data.columns
инициализируется плоским списком, который создает объект Index
, все хорошо:
data = pandas.DataFrame( numpy.random.randn( 5, 2 ) )
data.columns=[ 'one', 'two' ]
print( data )
# Output:
# one two
# 0 -1.242567 0.430084
# 1 -1.125710 -0.342616
# 2 -0.514284 0.479382
# 3 0.108649 -0.789272
# 4 1.489155 0.842427
criterion = data[ 'one' ] > 0 # NB: criterion.shape is (5,): it is one-dimensional
print( data[ criterion ] )
# Output:
# one two
# 3 0.108649 -0.789272
# 4 1.489155 0.842427
Однако, если я изменяю размерность структуры столбца (создавая MultiIndex
)тогда я смогу воссоздать описанный вами синдром NaN:
data.columns = [ [ 'one', 'two' ] ] # note the double-nesting
print(data) # it "looks" identical to how it did before...
# Output:
# one two
# 0 -1.242567 0.430084
# 1 -1.125710 -0.342616
# 2 -0.514284 0.479382
# 3 0.108649 -0.789272
# 4 1.489155 0.842427
criterion = data[ 'one' ] > 0 # but this criterion.shape is now (5,1): it's two-dimensional...
print( data[ criterion ] )
# Output:
# one two
# 0 NaN NaN
# 1 NaN NaN
# 2 NaN NaN
# 3 0.108649 NaN
# 4 1.489155 NaN
Это зависит от (внешне невидимых) деталей структуры столбца вашего DataFrame
.Для меня очень удивительно, что не было никаких предупреждений или исключений, когда вы выполняли нарезку, и я не могу представить себе никакого контекста, в котором результат с использованием NaN был бы разумным, ожидаемым результатом.
В любом случае,проблема может быть обойдена путем изменения формы массива, который вы используете для индексации ваших данных, так что его форма снова будет (5,)
:
print( data[ criterion.values.flatten() ] ) # back to sanity
# Output:
# one two
# 3 0.108649 -0.789272
# 4 1.489155 0.842427
Однако, если вы не хотите использовать какие-либо конкретныеMultiIndex
поведение, обеспечиваемое вашей существующей структурой столбцов, тогда более элегантное решение (обозначенное вашим комментарием) может быть просто переназначить data.columns
, чтобы убедиться, что это плоский список для начала.