2016-05-18 5 views
0

私は異なるグループに分けることができる列を持つDataFrameを持っています。エントリが元の値からグループ平均を差し引いたdfを返す必要があります。
groupbyを使って私は以下のことを行いました。DataFrameはグループ単位で減算することを意味します。

base = datetime.today().date() 
date_list = [base - timedelta(days=x) for x in range(0, 10)] 
df = pd.DataFrame(data=np.random.randint(1, 100, (10, 8)), index=date_list, columns=['a1', 'a2', 'b1', 'a3', 'b2', 'c1' , 'c2', 'b3']) 

xx = df.loc[[datetime(2016, 5, 18).date()]] 
xx.index = ['group'] 
xx.a1 = 1 
xx.a2 = 1 
xx.a3 = 1 
xx.b3 = 2 
xx.b2 = 2 
xx.b1 = 2 
xx.c1 = 3 
xx.c2 = 3 
df = df.append(xx) 
dft = df.T 
dft.groupby(['group']).mean().T 

更新20/05/16:unutbuの答えによって支援

、私は同様に、次の解決策を考え出す:

fTgroupby(グループ、軸= 0).apply(ラムダX :X - np.mean(x))をT

答えて

2

あなたがtransform方法、例えば、

means = df.groupby(group, axis=1).transform('mean') 

を使用する場合は、transformは、dfと同じ形状のDataFrameになります。これにより、meansdfから簡単に引き出すことができます。

列名を渡す代わりに、group=[1,1,1,2,2,3,3]df.groupbyなどのシーケンスを渡すこともできます。 df.groupby(group, axis=1)は、シーケンス値に基づいて列をグループ化します。したがって、たとえば、グループに各列名の非数値部分に応じて、あなたが使用できます。

import numpy as np 
import datetime as DT 
np.random.seed(2016) 
base = DT.date.today() 
date_list = [base - DT.timedelta(days=x) for x in range(0, 10)] 
df = pd.DataFrame(data=np.random.randint(1, 100, (10, 8)), 
        index=date_list, 
        columns=['a1', 'a2', 'b1', 'a3', 'b2', 'c1' , 'c2', 'b3']) 

group = df.columns.str.extract(r'(\D+)', expand=False) 
means = df.groupby(group, axis=1).transform('mean') 
result = df - means 
print(result) 

非常に多くの助けのための

  a1 a2 b1 a3 b2 c1 c2 b3 
2016-05-18 29 29 53 29 53 23 23 53 
2016-05-17 55 55 32 55 32 92 92 32 
2016-05-16 59 59 53 59 53 50 50 53 
2016-05-15 46 46 30 46 30 55 55 30 
2016-05-14 56 56 28 56 28 28 28 28 
2016-05-13 34 34 36 34 36 70 70 36 
2016-05-12 39 39 64 39 64 48 48 64 
2016-05-11 45 45 59 45 59 57 57 59 
2016-05-10 55 55 30 55 30 37 37 30 
2016-05-09 61 61 59 61 59 59 59 59 
+0

感謝を得ています。 .transform行を実行すると、「長さの不一致:期待される軸に10個の要素があり、新しい値に8個の要素があります」というエラーが表示されます。私はPython 2.7を使用しています – wh408

+0

私は解決策を得ました:df.T.groupby(group、axis = 0).apply(lambda x:x-np.mean(x))。興味深いことに、groupby.aggregate/transform/applyについては、apply()に軸オプションがないところはあまり見つからないので、2回変換する必要があります。 – wh408

関連する問題