2016-08-30 6 views
1

データフレームdfがあります。pandas dataframe、各グループの別の列の移動平均として1つの列を追加します。

dates = pd.date_range('2000-01-01', '2001-01-01') 
df1 = pd.DataFrame({'date':dates, 'value':np.random.normal(size = len(dates)), 'market':'GOLD'}) 
df2 = pd.DataFrame({'date':dates, 'value':np.random.normal(size = len(dates)), 'market':'SILVER'}) 
df = pd.concat([df1, df2]) 
df = df.sort('date') 

      date market  value 
0 2000-01-01 GOLD -1.361360 
0 2000-01-01 SILVER 0.255830 
1 2000-01-02 SILVER 0.196953 
1 2000-01-02 GOLD 1.422454 
2 2000-01-03 GOLD -0.827672 
... 

市場ごとに10d移動平均値として別の列を追加したいと考えています。

これを実現する簡単なdf.groupby('market').???はありますか?または、テーブルを幅広い形にピボットし、各列を滑らかにしてから溶かす必要がありますか?

答えて

3

あなたはgroupby/rolling/meanを使用することができます。

result = (df.set_index('date') 
      .groupby('market')['value'] 
      .rolling(10).mean() 
      .unstack('market')) 

これは、@のunutbuの回答に基づいて構築され、新しいカラムとして、元のデータフレームに戻って結果を加算

market   GOLD SILVER 
date       
2000-01-01  NaN  NaN 
2000-01-02  NaN  NaN 
2000-01-03  NaN  NaN 
2000-01-04  NaN  NaN 
2000-01-05  NaN  NaN 
2000-01-06  NaN  NaN 
2000-01-07  NaN  NaN 
2000-01-08  NaN  NaN 
2000-01-09  NaN  NaN 
2000-01-10 0.310077 0.582063 
2000-01-11 0.312008 0.752218 
2000-01-12 0.151159 0.877230 
2000-01-13 0.213611 0.742156 
2000-01-14 0.440113 0.614720 
2000-01-15 0.551360 0.649967 
... 
+0

次に、 'df ['avg'] = avg.GOLD.where(df.market == 'GOLD'、avg.SILVER)'を1つの列に追加します。 –

1

得られます。今dfならば、market最初dateでソートされている

result = df.set_index('date').groupby('market')['value'].rolling(10).mean() 

は、結果が同期する必要があります、あなたは私のように偏執的であれば、私たちはただ、

df.sort_values(['market','date'], inplace = True) 
df['value10d_1'] = result.values 

しかし値をバック割り当てることができますam、mergeは安心してください。

df = pd.merge(df, result.reset_index().rename(columns = {'value':'value10d_2'}), on = ['market','date']) 

df['value10d_1'] - df['value10d_2'] # all 0 
関連する問題