考虑以下代码:
>>> data = pandas.DataFrame({ 'user': [1, 5, 3, 10], 'week': [1, 1, 3, 4], 'value1': [5, 4, 3, 2], 'value2': [1, 1, 1, 2] })
>>> data = data.pivot_table(index='user', columns='week', fill_value=0)
>>> data['target'] = [True, True, False, True]
>>> data
value1 value2 target
week 1 3 4 1 3 4
user
1 5 0 0 1 0 0 True
3 0 3 0 0 1 0 True
5 4 0 0 1 0 0 False
10 0 0 2 0 0 2 True
现在,如果我这样称呼:
>>> 'target' in data.columns
True
按预期返回True
。但是,为什么这也会返回True
?
>>> 'target' in data.drop('target', axis=1).columns
True
如何从表中删除列以使其不再位于索引中并且上述语句返回False
?
答案 0 :(得分:3)
截至目前(pandas 0.19.2),多索引将保留其结构中所有使用过的标签。删除列并不会从多索引中删除其标签,并且仍会在其中引用它。请参阅GH项目here。
因此,您必须解决问题并做出假设。如果您确定要检查的标签位于特定索引级别(示例中为0级),那么一种方法是:
'target' in data.drop('target', axis=1).columns.get_level_values(0)
Out[145]: False
如果它可以是任何级别,您可以使用get_values()
并在整个列表中查找:
import itertools as it
list(it.chain.from_iterable(data.drop('target', axis=1).columns.get_values()))
Out[150]: ['value1', 1, 'value1', 3, 'value1', 4, 'value2', 1, 'value2', 3, 'value2', 4]