使IPython选项卡完成分层数据帧

使IPython选项卡完成分层数据帧,python,pandas,ipython,Python,Pandas,Ipython,IPython的一个有用特性是它的制表符完成功能,除此之外,它不需要记忆pandas.DataFrame列名 例如,假设我们有 df = pd.DataFrame({'bar': [1, 2], 'baz': [3, 4], 'bap': [5, 6]}) 给出dfas bap bar baz 0 5 1 3 1 6 2 4 bap foo bar baz 0 5 1 3 1 6 2 4 然后我们就可以打字了

IPython的一个有用特性是它的制表符完成功能,除此之外,它不需要记忆
pandas.DataFrame
列名

例如,假设我们有

df = pd.DataFrame({'bar': [1, 2], 'baz': [3, 4], 'bap': [5, 6]})
给出
df
as

    bap bar baz
0   5   1   3
1   6   2   4
    bap foo
        bar baz
0   5   1   3
1   6   2   4
然后我们就可以打字了

df.<Tab>
给出
df
as

    bap bar baz
0   5   1   3
1   6   2   4
    bap foo
        bar baz
0   5   1   3
1   6   2   4
然后
df.
将不会自动完成
bap
foo


什么是让它工作的正确方法?我已经写了一个hack,它可以做到这一点(下面的答案),但我对它依赖于。欢迎其他答案。

应用以下猴子贴片似乎可以消除问题的症状:

_orig_dir = getattr(pd.DataFrame, '__dir__')
def _mutilevel_aware_dir(df):
    multilevels = [tup for tup in df.columns if isinstance(tup, tuple)]
    return _orig_dir(df) + [tup[0] for tup in multilevels]
setattr(pd.DataFrame, '__dir__', _mutilevel_aware_dir)


_orig_get_attr = getattr(pd.DataFrame, '__getattr__')
def _mutilevel_aware_getattr(df, name):
    return _orig_get_attr(df, name)
setattr(pd.DataFrame, '__getattr__', _mutilevel_aware_getattr)
IPython显然间接地使用了
数据帧
的方法进行自动完成。 第一个函数在内部扫描元组,如果遇到元组,则将其第一个元素作为“伪”成员返回。第二个函数获取
\uuuu getattr\uuu
,用于处理访问此类伪成员时将返回的内容

把这些东西补到课堂上似乎很管用。然而,这是一个相当暴力的解决方案,它可能有副作用,我不知道