为什么列在被删除后仍保留在 DataFrame 的索引中

mar*_*jky 5 python pandas

考虑下面的代码:

>>> 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
Run Code Online (Sandbox Code Playgroud)

现在如果我这样称呼:

>>> 'target' in data.columns
True
Run Code Online (Sandbox Code Playgroud)

True按预期返回。然而,为什么这也会回归True呢?

>>> 'target' in data.drop('target', axis=1).columns
True
Run Code Online (Sandbox Code Playgroud)

如何从表中删除一列,使其不再位于索引中并且上述语句返回False

Bou*_*oud 4

截至目前(pandas 0.19.2),多重索引将在其结构中保留所有曾经使用过的标签。删除列不会从多重索引中删除其标签,并且仍然在其中引用它。请参阅此处的长 GH 项目。

因此,您必须解决该问题并做出假设。如果您确定要检查的标签位于特定索引级别(示例中为级别 0),那么一种方法是执行以下操作:

'target' in data.drop('target', axis=1).columns.get_level_values(0)
Out[145]: False
Run Code Online (Sandbox Code Playgroud)

如果它可以是任何级别,您可以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]
Run Code Online (Sandbox Code Playgroud)

  • 请注意,在 0.20.0(大约 1 个月)中,这将合并到:https://github.com/pandas-dev/pandas/pull/15694,这将允许``data.columns = data.columns.remove_unused_levels( )`` 来解决这个问题(它还不是自动的,但可以缓解问题) (2认同)