【问题标题】:No exception raised when accessing wrong column labels in Pandas?在 Pandas 中访问错误的列标签时不会引发异常?
【发布时间】:2017-03-08 10:29:14
【问题描述】:

即使列标签不存在,在某些情况下访问 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

更新:有一个建议的重复问题 (Safe label-based selection in DataFrame),但它是关于行选择的,我的问题是关于列选择的。

【问题讨论】:

  • 我没有看到那个问题,但它是关于行选择的,我的问题是关于列选择的。
  • 使用loc进行基于标签的选择,原理完全相同。
  • 我不知道它们是否相同,这些信息不应该在答案中进行解释吗?此外,这里接受的答案与那里不同。实际上,我希望有一个熊猫功能可以解决我的问题,但是正如答案中指出的那样,手动过滤列是要走的路。

标签: python pandas dataframe


【解决方案1】:

看起来因为至少有一列存在,它返回一个放大的 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

这也处理完全缺失的列:

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

Out[81]:
Empty DataFrame
Columns: []
Index: [0, 1, 2, 3, 4]

这也处理你的后一种情况:

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

更新

如果您只想测试是否所有都有效,您可以遍历列表中的每一列并附加 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']

【讨论】:

  • 谢谢。如果我想在列名不存在时捕获怎么办?例如,'wrong_lb' 是一个错字,我想找出并修正它?
  • 您可以遍历每一列然后捕获KeyError 异常,请参阅更新后的答案
  • 谢谢,所以我会尝试在辅助方法 val_cols() 中做一些事情。
  • 是的,这是设计使然,但是像我展示的那样,制作自己的 func 来做不同的事情并不难
猜你喜欢
  • 2019-04-04
  • 2018-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 2011-02-28
相关资源
最近更新 更多