16

多くの場合、基本データを保持するための大きなデータフレームdfがあり、基本データ列によって計算された派生データを保持するためにさらに多くの列を作成する必要があります。

私はパンダでそれを行うことができます:

df['derivative_col1'] = df['basic_col1'] + df['basic_col2']
df['derivative_col2'] = df['basic_col1'] * df['basic_col2']
....
df['derivative_coln'] = func(list_of_basic_cols)

など。パンダは、すべての派生列のメモリを一度に計算して割り当てます。

私が今欲しいのは、派生列の計算とメモリ割り当てを実際に必要な瞬間まで延期するための遅延評価メカニズムを持つことです。lazy_eval_columns を次のように定義します。

df['derivative_col1'] = pandas.lazy_eval(df['basic_col1'] + df['basic_col2'])
df['derivative_col2'] = pandas.lazy_eval(df['basic_col1'] * df['basic_col2'])

これにより、Python の「利回り」ジェネレーターのように時間/メモリを節約できますdf['derivative_col2']。コマンドを発行すると、特定の計算とメモリ割り当てのみがトリガーされるためです。

lazy_eval()では、パンダで行う方法は? ヒント/考え/参照は大歓迎です。

4

2 に答える 2

13

0.13 (まもなくリリース) から、このようなことができます。これは、動的数式を評価するためにジェネレーターを使用しています。eval によるインライン割り当ては、0.13 の追加機能になります。こちらを参照してください。

In [19]: df = DataFrame(randn(5, 2), columns=['a', 'b'])

In [20]: df
Out[20]: 
          a         b
0 -1.949107 -0.763762
1 -0.382173 -0.970349
2  0.202116  0.094344
3 -1.225579 -0.447545
4  1.739508 -0.400829

In [21]: formulas = [ ('c','a+b'), ('d', 'a*c')]

を使用して数式を評価するジェネレータを作成しますeval。結果を代入し、結果を生成します。

In [22]: def lazy(x, formulas):
   ....:     for col, f in formulas:
   ....:         x[col] = x.eval(f)
   ....:         yield x
   ....:         

活動中

In [23]: gen = lazy(df,formulas)

In [24]: gen.next()
Out[24]: 
          a         b         c
0 -1.949107 -0.763762 -2.712869
1 -0.382173 -0.970349 -1.352522
2  0.202116  0.094344  0.296459
3 -1.225579 -0.447545 -1.673123
4  1.739508 -0.400829  1.338679

In [25]: gen.next()
Out[25]: 
          a         b         c         d
0 -1.949107 -0.763762 -2.712869  5.287670
1 -0.382173 -0.970349 -1.352522  0.516897
2  0.202116  0.094344  0.296459  0.059919
3 -1.225579 -0.447545 -1.673123  2.050545
4  1.739508 -0.400829  1.338679  2.328644

そのため、ユーザーは評価の順序を決定しました (オンデマンドではありません)。理論的numbaにはこれをサポートする予定なので、pandas はこれをバックエンドとしてサポートする可能性がありますeval(現在、即時評価に numexpr を使用しています)。

私の2c。

遅延評価は素晴らしいですが、Python 独自の継続/生成機能を使用することで簡単に実現できるため、パンダに組み込むことは可能ですが、非常にトリッキーであり、一般的に役立つには本当に優れたユースケースが必要です。

于 2013-10-26T20:39:47.547 に答える