【发布时间】:2013-02-05 20:49:33
【问题描述】:
我发现自己编写了这种模式很多:
tmp = <some operation>
result = tmp[<boolean expression>]
del tmp
...其中<boolean expression> 应理解为布尔表达式涉及 tmp。 (目前,tmp 始终是 pandas 数据框,但我想如果我使用 numpy ndarrays 会出现相同的模式——不确定。)
例如:
tmp = df.xs('A')['II'] - df.xs('B')['II']
result = tmp[tmp < 0]
del tmp
从结尾处的del tmp 中可以猜到,创建tmp 的唯一 原因是我可以在应用到的索引表达式中使用涉及它的布尔表达式它。
我很想消除对这种(否则无用的)中间体的需求,但我不知道有任何有效的1 方法来做到这一点。 (如果我错了,请纠正我!)
作为第二好的,我想把这个模式推到一些辅助函数上。问题是找到一种体面的方式将<boolean expression> 传递给它。我只能想到不雅的。例如:
def filterobj(obj, criterion):
return obj[eval(criterion % 'obj')]
这确实有效2:
filterobj(df.xs('A')['II'] - df.xs('B')['II'], '%s < 0')
# Int
# 0 -1.650107
# 2 -0.718555
# 3 -1.725498
# 4 -0.306617
# Name: II
...但是使用eval 总是让我觉得所有的东西都令人讨厌...如果有其他方法请告诉我。
1例如,我能想到的任何涉及 filter 内置函数的方法都可能效率低下,因为它会通过“在 Python 中”迭代来应用标准(一些 lambda 函数),在熊猫(或 numpy)对象上...
2上面最后一个表达式中使用的df的定义是这样的:
import itertools
import pandas as pd
import numpy as np
a = ('A', 'B')
i = range(5)
ix = pd.MultiIndex.from_tuples(list(itertools.product(a, i)),
names=('Alpha', 'Int'))
c = ('I', 'II', 'III')
df = pd.DataFrame(np.random.randn(len(idx), len(c)), index=ix, columns=c)
【问题讨论】:
-
只需使用
result的名称为tmp;)