Разрезание по питону не выдает ошибку ключа, даже если столбец отсутствует
У меня есть пандас с 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
), проверьте здесь.