Разрезание по питону не выдает ошибку ключа, даже если столбец отсутствует

У меня есть пандас с 10 ключами. Если я пытаюсь получить доступ к столбцу, которого нет, даже тогда он возвращает NaN для этого. Я ожидал ключевой ошибки. Как панды не могут определить отсутствующий столбец?

В приведенном ниже примере vendor_id является допустимым столбцом в кадре данных. Другой столбец отсутствует в наборе данных.

final_feature.ix[:,['vendor_id','this column is absent']]
Out[1017]: 
  vendor_id  this column is absent
0    434236                    NaN

type(final_feature)
Out[1016]: pandas.core.frame.DataFrame

РЕДАКТИРОВАТЬ 1: Подтверждено, что нет нулевых значений

print (final_feature1.isnull().values.any())

2 ответа

Решение

Это ожидаемое поведение и связано с настройкой функции с расширением

In [15]:
df = pd.DataFrame(np.random.randn(5,3), columns=list('abc'))
df.ix[:,['a','d']]

Out[15]:
          a   d
0 -1.164349 NaN
1  0.400116 NaN
2 -0.599496 NaN
3  0.186837 NaN
4  0.385656 NaN

Если вы попытаетесь df['d'] или же df[['a','d']] тогда вы получите KeyError

Эффективно то, что вы делаете, это переиндексация, тот факт, что столбец не существует при использовании ix не имеет значения, вы просто получите столбец NaN s

Такое же поведение наблюдается при использовании loc:

In [24]:
df.loc[:,['a','d']]

Out[24]:
          a   d
0 -1.164349 NaN
1  0.400116 NaN
2 -0.599496 NaN
3  0.186837 NaN
4  0.385656 NaN

Когда вы не используете ix или же loc и попытаться сделать df['d'] вы пытаетесь проиндексировать определенный столбец или список столбцов, здесь не ожидается увеличения, если вы не назначаете новый столбец: например, df['d'] = some_new_vals

Чтобы защититься от этого, вы можете проверить свой список, используя isin с колонками:

In [26]:
valid_cols = df.columns.isin(['a','d'])
df.ix[:, valid_cols]

Out[26]:
          a
0 -1.164349
1  0.400116
2 -0.599496
3  0.186837
4  0.385656

Теперь вы будете видеть только существующие столбцы, плюс если вы неправильно написали какие-либо столбцы, то это также защитит от этого

Для меня работает отбор subset:

final_feature[['vendor_id','this column is absent']]

KeyError: "['этот столбец отсутствует'] отсутствует в индексе"

Также ix устарела в последней версии панд (0.20.1), проверьте здесь.

Другие вопросы по тегам