2016-09-23 15 views
4


理解のための非常に単純な例です。他の列のローリング関数の結果に応じてpandas DataFrame列の値を計算する方法

目的は、別の列のローリング関数の結果に応じて、pandas DataFrame列の値を計算することです。

私は、次のデータフレームがあります。

import numpy as np 
import pandas as pd 

s = pd.Series([1,2,3,2,1,2,3,2,1])  
df = pd.DataFrame({'DATA':s, 'POINTS':0}) 

df 

DataFrame start

注:私もStackOverflowの編集ウィンドウでJupyterノートブックの結果をフォーマットする方法がわからないので、私はコピー&ペーストイメージ、私はあなたの許しを請う。

カラムは、観測データを示す。 POINTSカラムは、0に初期化され、以下で説明するように、DATAカラムに適用される「ローリング」関数の出力を収集するために使用されます。ただ、例えば= 4

nwin = 4 

ウィンドウを設定し

"ローリング" 機能は、最大を計算します。

ここで、私が必要とするものを説明するために図面を使用しましょう。各反復について

Algo flow

、圧延機能は、ウィンドウ内のデータの最大値を計算します。その後、最大データの同じインデックスにあるPOINTが1

インクリメントされ、最終的な結果は次のとおりです。

DataFrame end

あなたは、Pythonのコードで私を助けることができますか?

本当にありがとうございます。

ジルベルトが

、お時間を事前にありがとうございP.S. Jupyterノートブックの書式設定されたセルをStackoverflow編集ウィンドウにコピーアンドペーストする方法も提案できますか?ありがとうございました。

+1

コピー 'プリント(DF)の出力'を編集ウインドウで開き、すべてをツールバーのコード(' {} ')として整形します。 [再現性の良いパンダの例を作る方法](http://stackoverflow.com/questions/20109391/how-to-make-good-reproducible-pandas-examples)も参照してください。 – IanS

+0

"繰り返しごとにローリング関数がウィンドウ内のデータの最大値を計算し、最大DATAの同じインデックスのPOINTが1だけインクリメントされます。 - 私は理解していない:これは '(df.DATA.rolling(4).max()== df.DATA).astype(int)'によって 'POINTS 'をインクリメントするのではないか?しかし、それはあなたの出力例に合っていません。 –

+1

@AmiTavory、私が理解しているように、最初の3つのローリングウィンドウはインデックス2に最大値を持つので、インデックス2のPOINTSの値は3回インクリメントされます。 4番目のローリングウィンドウはもはやインデックス2をカバーしないので、アルゴリズムは上に移動します。興味深い問題は、私は言うだろう... – IanS

答えて

2

IIUC @IanSによって説明(おかげで再び!)、あなたが列を更新するには

In [75]: np.array([df.DATA.rolling(4).max().shift(-i) == df.DATA for i in range(4)]).T.sum(axis=1) 
Out[75]: array([0, 0, 3, 0, 0, 0, 3, 0, 0]) 

を行うことができます。

In [78]: df = pd.DataFrame({'DATA':s, 'POINTS':0}) 

In [79]: df.POINTS += np.array([df.DATA.rolling(4).max().shift(-i) == df.DATA for i in range(4)]).T.sum(axis=1) 

In [80]: df 
Out[80]: 
    DATA POINTS 
0  1  0 
1  2  0 
2  3  3 
3  2  0 
4  1  0 
5  2  0 
6  3  3 
7  2  0 
8  1  0 
+0

ありがとう@AmiTavory!私のPythonの知識はまだ貧しいですが、あなたの答えは私を非常に助けます。 – Gilberto

+0

そして私の質問を明確にするために@IanSに助けてくれてありがとう。 – Gilberto

1
import pandas as pd 

s = pd.Series([1,2,3,2,1,2,3,2,1])  
df = pd.DataFrame({'DATA':s, 'POINTS':0}) 

df.POINTS=df.DATA.rolling(4).max().shift(-1) 
df.POINTS=(df.POINTS*(df.POINTS==df.DATA)).fillna(0) 
関連する問題