2016-11-15 7 views
0

既存のパンダデータフレームmydfに新しい列を割り当てようとしています。追加される系列は、文字列として渡される式を評価した結果です。発現は、例えば、Pythonの関数呼び出しを含むことができる:時系列データとgroupbyでpandasでassignを使用する

formula = 'myfunction(mydf.v1)' 

myfunction

def myfunction(series): 
    return recursive_filter(series, 0.1) 

を次のように次のコードは、式を評価し、myfunctionを実行し、mydf

mydf.assign(v2 = eval(formula)) 
に列 v2を割り当てるあります

ただし、私はMarketで関数を実行する必要があります。出力は

mydf.groupby('CrossSection').apply(mydf.assign(v2 = eval(formula))) 

は、しかし、これは、このエラーを生成します(...私は正しい結果を生成することになるかわからない)私は、次のコードを試してみました

Market  Date   v1 v2 
UK   2013-01-01 10 10.00 
UK   2013-01-02 10 11.00 
UK   2013-01-03 10 11.10 
UK   2013-01-04 10 11.11 
US   2013-01-01 10 10.00 
US   2013-01-02 10 11.00 
US   2013-01-03 10 11.10 
US   2013-01-04 10 11.11 

下記の表のようになります

TypeError: 'DataFrame' objects are mutable, thus they cannot be hashed 

答えて

0

問題の1つは、式がDataFrameをハードコードして適用することです。つまり、mydfです。

とにかく、これはうまくいくはずです。私は別のデータフレームを作成しない方法を見つけることができませんでしたが、あなたのデータセットがそれほど大きくない場合は、それほど重要ではありません。

これを適用するデータフレームの文字列フォーマットを受け入れるように式を書き直しました。

from statsmodels.tsa.filters.filtertools import recursive_filter 

formula = 'myfunction({}.v1)' 
def myfunction(series): 
    return recursive_filter(series, 0.1) 

df2 = mydf.groupby('Market').apply(lambda df: df.assign(v2 = eval(formula.format("df")))) 
df2.index = df2.index.droplevel(level=0) 
df2 

結果:

Market  Date v1  v2 
0  UK 2013-01-01 10 10.00 
1  UK 2013-01-02 10 11.00 
2  UK 2013-01-03 10 11.10 
3  UK 2013-01-04 10 11.11 
4  US 2013-01-01 10 10.00 
5  US 2013-01-02 10 11.00 
6  US 2013-01-03 10 11.10 
7  US 2013-01-04 10 11.11 
関連する問題