2015-05-27 112 views
0

IPython的一個有用功能是它的製表符完成功能,除此之外無需記憶pandas.DataFrame列名。製作IPython Tab-Complete分層熊貓DataFrames

例如,假設我們有

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(等等)作爲成員,作爲w試圖完成它們。

不幸的是,這個有用的功能在層次數據框中部分消失。例如,如果我們改變的事情

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

什麼是正確的方式來得到這個工作?我已經寫了一個黑客這樣做(下面的答案),但不高興的依賴Python monkey-patching。其他答案將受到歡迎。

回答

0

應用以下猴子補丁似乎消除問題的症狀:

_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的顯然間接使用DataFrame爲自動完成的__dir__方法。 第一個函數內部掃描元組,如果遇到它們,則將其第一個元素作爲「虛擬」成員返回。第二個函數抓取__getattr__來處理訪問這樣的虛擬成員時將返回的內容。

將這些修補到課堂上似乎可以完成這項工作。但是,這是一個相當暴力的解決方案,它可能有我不知道的副作用。