[英]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>
它將顯示bap
, bar
和baz
(以及其他)作為成員,並嘗試完成它們。
不幸的是,這種有用的功能隨着分層數據幀而部分消失。 例如,如果我們將其更改為
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>
不會自動完成bap
或foo
。
使此工作正常的正確方法是什么? 我已經寫了一個可以做到這一點的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.