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
时该列不存在的事实并不重要,你只会得到一列 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
现在您将只会看到存在的列,此外,如果您拼错了任何列,它也会防止出现这种情况
我有一个包含 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
时该列不存在的事实并不重要,你只会得到一列 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
现在您将只会看到存在的列,此外,如果您拼错了任何列,它也会防止出现这种情况