繁体   English   中英

使IPython制表符完整的分层熊猫DataFrame

[英]Making IPython Tab-Complete Hierarchical pandas DataFrames

IPython的有用功能之一是它的制表符pandas.DataFrame ,除其他外,它不需要记住pandas.DataFrame列名。

例如,假设我们有

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

df

    bap bar baz
0   5   1   3
1   6   2   4

然后我们可以输入

df.<Tab>

它将显示bapbarbaz (以及其他)作为成员,并尝试完成它们。

不幸的是,这种有用的功能随着分层数据帧而部分消失。 例如,如果我们将其更改为

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

df

    bap foo
        bar baz
0   5   1   3
1   6   2   4

然后df.<Tab>不会自动完成bapfoo

使此工作正常的正确方法是什么? 我已经写了一个可以做到这一点的hack(下面有答案),但是对依赖于Python Monkey-patching感到不满意。 其他答案将受到欢迎。

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

_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的显然间接使用__dir__一个的方法DataFrame用于自动完成。 第一个函数在内部扫描元组,如果遇到元组,则将其第一个元素作为“虚拟”成员返回。 第二个函数获取__getattr__用于处理访问此类虚拟成员时将返回的内容。

将这些修补到班上似乎可以完成工作。 但是,这是一个相当猛烈的解决方案,可能会有我不知道的副作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM