簡體   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