在大熊猫访问错误的列标签时也不例外长大的吗?

THN*_*THN 3 python dataframe pandas

在某些情况下,即使不存在列标签,访问Pandas数据框也不会引发异常。

我应该如何检查这些情况,以避免读到错误的结果?

a = pd.DataFrame(np.zeros((5,2)), columns=['la', 'lb'])

a
Out[349]: 
    la   lb
0  0.0  0.0
1  0.0  0.0
2  0.0  0.0
3  0.0  0.0
4  0.0  0.0

a.loc[:, 'lc']  # Raised exception as expected.

a.loc[:, ['la', 'lb', 'lc']]  # Not expected.
Out[353]: 
    la   lb  lc
0  0.0  0.0 NaN
1  0.0  0.0 NaN
2  0.0  0.0 NaN
3  0.0  0.0 NaN
4  0.0  0.0 NaN

a.loc[:, ['la', 'wrong_lb', 'lc']]  # Not expected.
Out[354]: 
    la  wrong_lb  lc
0  0.0       NaN NaN
1  0.0       NaN NaN
2  0.0       NaN NaN
3  0.0       NaN NaN
4  0.0       NaN NaN
Run Code Online (Sandbox Code Playgroud)

更新:有一个建议重复的问题(在数据帧基于标签安全的选择),但它是关于行选择,我的问题是关于列选择。

EdC*_*ica 5

它看起来像是因为至少存在一列,所以它返回一个放大的df作为重新索引操作。

您可以定义一个用户函数来验证将处理该列是否存在的列。在这里,我从传入的iterable中构造一个pandas Index对象,并调用intersection以从现有df中返回并传入iterable的公共值:

In [80]:
def val_cols(cols):
    return pd.Index(cols).intersection(a.columns)
?
a.loc[:, val_cols(['la', 'lb', 'lc'])] 

Out[80]:
    la   lb
0  0.0  0.0
1  0.0  0.0
2  0.0  0.0
3  0.0  0.0
4  0.0  0.0
Run Code Online (Sandbox Code Playgroud)

这也可以处理完全丢失的列:

In [81]:
a.loc[:, val_cols(['x', 'y'])] 

Out[81]:
Empty DataFrame
Columns: []
Index: [0, 1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

这也可以处理您的后一种情况:

In [83]:
a.loc[:, val_cols(['la', 'wrong_lb', 'lc'])]

Out[83]:
    la
0  0.0
1  0.0
2  0.0
3  0.0
4  0.0
Run Code Online (Sandbox Code Playgroud)

更新

如果您只想测试所有内容是否有效,则可以遍历列表中的每一列并附加duff列:

In [93]:
def val_cols(cols):
    duff=[]
    for col in cols:
        try:
            a[col]
        except KeyError:
            duff.append(col)
    return duff
invalid = val_cols(['la','x', 'y'])
print(invalid)

['x', 'y']
Run Code Online (Sandbox Code Playgroud)