私はこの種のパターンをたくさんコーディングしていることに気づきました:
tmp = <some operation>
result = tmp[<boolean expression>]
del tmp
... whereは、 を含む<boolean expression>
ブール式として理解されるべきです。(当分の間、常に pandas データフレームですが、numpy ndarrays を使用している場合、同じパターンが表示されると思います-よくわかりません。) tmp
tmp
例えば:
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
は、おそらく非効率的です。これは、パンダ (または numpy) オブジェクトに対して「Python で」反復することによって基準 (ラムダ関数) を適用するためです...
2上記の最後の式の used の定義は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)