2016-05-10 8 views
2

私は計算を行うためにデータフレーム行がある状況があり、これらの計算を行うには次の(潜在的に先行する)行に値を使用する必要があります実際のデータセットに基づいて予測)。以前のdf.applyコールから各行を取得するので、下流のオブジェクトにdf全体を渡すことができましたが、それは分析のオブジェクトの複雑さに基づいて理想的ではありません。他の行の値を使用してパンダのデータフレーム行に関数を適用する

私は1つの密接に関連した質問と答え[1]を見つけましたが、問題は実際に私の計算にdf全体を必要としないという意味では基本的に異なります。大きなdfs)。

ので、例えば:

df = pd.DataFrame([100, 200, 300, 400, 500, 600, 700, 800, 900, 1000], 
        columns=['PRICE']) 
horizon = 3 

私は私の行単位df.applyコールで、次の3(horizon)行の値にアクセスする必要があります。行方向の適用計算で動的に次の3つのデータポイントの予測を得るにはどうすればよいですか?例えば行の最初の行は、PRICE100であるため、私は計算の中で予測として[200, 300, 400]を使用する必要があります。 row.nameを使用してdf.applyコールの内の行のインデックスを取得することにより、

[1] apply a function to a pandas Dataframe whose returned value is based on other rows

答えて

3

を[1]、あなたはあなたが現在である行に「予測」データの相対を生成することができます。これは事実上、関連する行に「予測」を入れるための前処理ステップです。または、dfが下流で使用可能な場合は、最初のdf.applyコールの一部として実行できます。この中

df = pd.DataFrame([100, 200, 300, 400, 500, 600, 700, 800, 900, 1000], columns=['PRICE']) 
horizon = 3 

df['FORECAST'] = df.apply(lambda x: [df['PRICE'][x.name+1:x.name+horizon+1]], axis=1) 

結果:あなたの行単位df.apply CALCSで使用することができ

PRICE   FORECAST 
0 100 [200, 300, 400] 
1 200 [300, 400, 500] 
2 300 [400, 500, 600] 
3 400 [500, 600, 700] 
4 500 [600, 700, 800] 
5 600 [700, 800, 900] 
6 700 [800, 900, 1000] 
7 800  [900, 1000] 
8 900   [1000] 
9 1000    [] 

EDIT: あなたは結果の '予測' からインデックスを削除したい場合:

df['FORECAST'] = df.apply(lambda x: [df['PRICE'][x.name+1:x.name+horizon+1].reset_index(drop=True)], axis=1) 

を[1] getting the index of a row in a pandas apply function

1

をあなたにもこれが役に立つかもしれません。

keys = range(horizon + 1) 
pd.concat([df.shift(-i) for i in keys], axis=1, keys=keys) 

     0  1  2  3 
    PRICE PRICE PRICE PRICE 
0 100 200.0 300.0 400.0 
1 200 300.0 400.0 500.0 
2 300 400.0 500.0 600.0 
3 400 500.0 600.0 700.0 
4 500 600.0 700.0 800.0 
5 600 700.0 800.0 900.0 
6 700 800.0 900.0 1000.0 
7 800 900.0 1000.0  NaN 
8 900 1000.0  NaN  NaN 
9 1000  NaN  NaN  NaN 

あなたはdf_c

keys = range(horizon + 1) 
df_c = pd.concat([df.shift(-i) for i in keys], axis=1, keys=keys) 

df_c.apply(lambda x: pd.Series([x[0].values, x[1:].values]), axis=1) 

      0      1 
0 [100.0] [200.0, 300.0, 400.0] 
1 [200.0] [300.0, 400.0, 500.0] 
2 [300.0] [400.0, 500.0, 600.0] 
3 [400.0] [500.0, 600.0, 700.0] 
4 [500.0] [600.0, 700.0, 800.0] 
5 [600.0] [700.0, 800.0, 900.0] 
6 [700.0] [800.0, 900.0, 1000.0] 
7 [800.0] [900.0, 1000.0, nan] 
8 [900.0]  [1000.0, nan, nan] 
9 [1000.0]   [nan, nan, nan] 
+0

concatを割り当てる場合は、パフォーマンス上の利点一つの方法または他のがあると思うし、どのような状況下でますか? – lukewitmer

+1

@lukewitmerいいえ、私は '%% timeit'を実行しました。あなたのワットは5倍以上速くなりました。私はそれがもっとエレガントだから私の方法が好きです。しかし、私はあなたの道を行くでしょう。その理由は、その直感的で迅速なことです。 – piRSquared

関連する問題