2017-12-25 29 views
1

新しい列を作成しようとしています。これは「HomeForm」と呼ばれます。これは、各項目の「FTHG」の最後の5つの値の合計です。 "HomeTeam"の列。別の列の最後のxオカレンスを合計する列を作成する

チーム0の場合、チーム0に対応する "FTHG"の最後の5つの値の合計を新しい列のセルに挿入することが考えられます。テーブルは日付順に並べられます。

どのようにしてPythonで実行できますか?

 HomeTeam FTHG HomeForm 
Date     
136   0  4 
135   2  0 
135   4  2 
135   5  0 
135   6  1 
135   13  0 
135   17  3 
135   18  1 
134   11  4 
134   12  0 
128   1  0 
128   3  0 
128   8  2 
128   9  1 
128   13  3 
128   14  1 
128   15  0 
127   7  1 
127   16  1 
126   10  1 

ありがとうございます。

def f(x): 
    return x.shift().rolling(window=5, min_periods=1).sum() 

この関数は、実行 -

+0

をあなたが何をしたいのかの例を教えてください。さらに、データにチーム「0」行が1つしかありませんか? –

+0

申し訳ありませんが、私は結果が再割り当てではなくマージが必要であることを認識しています(そうでなければ、結果は正しかったが、整列していません)。今見てみましょう、意味をなさないでしょう。 –

答えて

2

あなたはHomeTeamgroupbyとは定義し、5

第1期間の最小値、最大値のために合計し、ここで機能をrollingsumを実行します前の5試合のローリング合計(したがって、shift)。必要に応じて

df['HomeForm'] = df.groupby('HomeTeam', sort=False).FTHG.transform(f) 
df 

     HomeTeam FTHG HomeForm 
Date       
136   0  4  NaN 
135   2  0  NaN 
135   4  2  NaN 
135   5  0  NaN 
135   6  1  NaN 
135   13  0  NaN 
135   17  3  NaN 
135   18  1  NaN 
134   11  4  NaN 
134   12  0  NaN 
128   1  0  NaN 
128   3  0  NaN 
128   8  2  NaN 
128   9  1  NaN 
128   13  3  0.0 
128   14  1  NaN 
128   15  0  NaN 
127   7  1  NaN 
127   16  1  NaN 
126   10  1  NaN 

、ゼロでNaNを記入し、整数に変換 - - dfGroupBy.transformにこの機能を渡し

df['HomeForm'] = df['HomeForm'].fillna(0).astype(int) 
+0

@coldspeedそれをありがとう!私が心に持っていたことを正確に行います。私の唯一の問題は、元のデータフレームにマージするときです。実際には、データフレームに20個の列があり、新しい「HomeForm」列は追加されていないからです。その周りには何か? また、私が理解していないのは、私の場合、 "df"データフレームが20の何かの列を持っているときに、テーブルjを印刷するときに3 colmuns( "HomeTeam"、 "Date" and "HomeForm" 。 – Miguel

+0

@COLDSPEEDまた、私が正しく理解している場合、これは "HomeForm"列に自分のゲームの結果を含めます。この考えは、前の5つのゲームのみを含むことであり、すなわち、現在のゲームの結果は未知ではない。データにオフセットを適用する方法はありますか? – Miguel

+0

@Miguel Understood、編集を参照してください。私は、私の改訂された方法は、より迅速で簡潔なことに加えて、あなたのフォローアップの質問をすべて満たすべきだと思います。 –

関連する問題