Выбор строк DataFrame: почему результат заполняется значениями NaN? - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть набор данных, в котором я хотел бы выбрать данные, в которых только дата отправки превышает «2018/11/14 01:26 PM».

Код ниже - это то, что у меня есть, но все остальные столбцы в наборе данных заполняются значением nan.Что я делаю неправильно?

d = datetime.strptime('2018-11-14 01:26PM', '%Y-%m-%d %H:%M%p')
data[data['submission_date'] > d]

Пример данных ниже:

 ID    Name   submission_date  
 12    Mike   2018-11-14 01:26PM
 13    Mark   2018-11-14 02:00PM
 14    Taylor 2018-11-14 03:26PM
 14    Taylor 2018-11-15 03:26PM

1 Ответ

0 голосов
/ 20 ноября 2018

Я почти ничего не знаю о 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, чтобы убедиться, что это плоский список для начала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...