2017-09-21 14 views
2

パンダの新しいので、私に同行してください。パンダ - 複数の列でグループ分けされた移動平均

私のデータフレームは

date,name,country,tag,cat,score 
2017-05-21,X,US,free,4,0.0573 
2017-05-22,X,US,free,4,0.0626 
2017-05-23,X,US,free,4,0.0584 
2017-05-24,X,US,free,4,0.0563 
2017-05-21,X,MX,free,4,0.0537 
2017-05-22,X,MX,free,4,0.0640 
2017-05-23,X,MX,free,4,0.0648 
2017-05-24,X,MX,free,4,0.0668 

は私が国/タグ/カテゴリグループ内のX日移動平均を見つけるために、方法を考え出すしようとしているフォーマットであるので、私は必要があります。

date,name,country,tag,cat,score,moving_average 
2017-05-21,X,US,free,4,0.0573,0 
2017-05-22,X,US,free,4,0.0626,0.0605 
2017-05-23,X,US,free,4,0.0584,0.0594 
2017-05-24,X,US,free,4,0.0563,and so on 
... 
2017-05-21,X,MX,free,4,0.0537,and so on 
2017-05-22,X,MX,free,4,0.0640,and so on 
2017-05-23,X,MX,free,4,0.0648,and so on 
2017-05-24,X,MX,free,4,0.0668,and so on 

私はpd.rolling_mean使用して、その後、私は必要な列によってグループ化の行に何かをしようとしたが、私はNaNでの

df.groupby(['date', 'name', 'country', 'tag'])['score'].apply(pd.rolling_mean, 2, min_periods=2) # window size 2 
の束で終わります

これを正しく行うにはどうすればいいですか?

+1

あなたは 'date'でグループいけない:' df.groupby([ '名前'、 '国'、 'タグ'])[ 'df.groupby([' col1 '、' col2 '])[' score '] apply(pd.rolling_mean、2、min_periods = 2) ' – Wen

+1

あなたのデータを再作成しませんでしたが、 'col3']。apply(lambda x:x.rolling(window = 3、center = True).mean()) 'それはうまくいきました。 'rolling_mean'は推奨されておらず、代わりに' rolling'を使うべきです。 –

+0

ありがとう@Wen、 'date'によるグループ分けは私の最後で大きなエラーでした – Craig

答えて

2

IIUC:

(df.assign(moving_score=df.groupby(['name','country','tag'], as_index=False)[['score']] 
          .rolling(2, min_periods=2).mean().fillna(0) 
          .reset_index(0, drop=True))) 

出力:

  date name country tag cat score moving_score 
0 2017-05-21 X  US free 4 0.0573  0.00000 
1 2017-05-22 X  US free 4 0.0626  0.05995 
2 2017-05-23 X  US free 4 0.0584  0.06050 
3 2017-05-24 X  US free 4 0.0563  0.05735 
4 2017-05-21 X  MX free 4 0.0537  0.00000 
5 2017-05-22 X  MX free 4 0.0640  0.05885 
6 2017-05-23 X  MX free 4 0.0648  0.06440 
7 2017-05-24 X  MX free 4 0.0668  0.06580 
+0

@Craigあなたはこの答えを受け入れることができます~~ :) – Wen

関連する問題