[英]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.