python 即使列丢失,切片也不会给出键错误

python slicing does not give key error even when the column is missing

我有一个包含 10 个键的 pandas 数据框。如果我尝试访问一个不存在的列,即使这样它也会 returns 一个 NaN。我期待一个 KeyError。 pandas 为何无法识别缺失的列?

在下面的示例中,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())

我的作品 select subset:

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

KeyError: "['this column is absent'] not in index"

此外 ix 在 pandas (0.20.1) 的最新版本中已弃用,check here.

这是预期的行为,是由于功能 setting with enlargement

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 时该列不存在的事实并不重要,你只会得到一列 NaNs

使用 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

当您不使用 ixloc 并尝试执行 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

现在您将只会看到存在的列,此外,如果您拼错了任何列,它也会防止出现这种情况