2017-02-06 8 views
1

パンダのヘルプファイルには、次のように書かれています(evalの場合): 便宜上、複数行の文字列を使用して複数の代入を実行できます。パンダのeval関数で複数の代入を持つローカル変数を使用する

しかし、私はそれが(ipython使用)の変数では動作しません探している:

df_price.eval("op = op * @mult", inplace = True) 

をしかし、これは(OP、CL、HI、LOは動作しません:

これは動作します

df_price.eval("""op = op * @mult 
       cl = cl * @mult 
       hi = hi * @mult 
       lo = lo * @mult""", inplace = True) 

エラー: pandas.computation.ops.UndefinedVariableError:LOC MULTはフロートであるデータフレームdf_priceでCOLS)でありますal変数 'mult'は定義されていません

+0

私は、この問題の修正を含むプルリクエストを提出しました。更新された回答をご覧ください。 –

+0

修正を提出していただきありがとうございます。 – techvslife

+0

修正はmainにマージされ、マイルストーン '0.20.0'の一部としてタグ付けされました。乾杯。 –

答えて

1

ローカル変数は、マルチラインeval式の最初の行にのみ作用するように見えます。可能な回避策:

df_price.eval("""mult = @mult 
       op = op * mult 
       cl = cl * mult 
       hi = hi * mult 
       lo = lo * mult""", inplace = True) 

ただし、余分な列を作成するという副作用があります。

更新:

私はこの問題の修正プログラムをPull Requestを提出しました。

+0

ありがとう。その場合、stringをevalに渡す前にmultをその値で置き換える文字列を置き換えます。とにかくこれが4つの別個の評価声明よりも速いかどうか調査していない。トリプルクォートがぎこちない - セミコロンで区切ったほうが良いか、リストを許可すると言っています:df_price.eval(["op = op * @mult"、 "cl = cl * @mult"]、 inplace = True) – techvslife

+0

あなたのリストの例では、結合が追加されているだけです。 'df.eval(" \ n ".join(.. my_list ..))' –

+0

良い点、うまくいくはずです。しかし、私はまだ複数のコマンドを処理するために改行を必要としないようにevalを変更する必要があると思います。リストの分離で十分です。 – techvslife

関連する問題