2016-10-24 11 views
2

このようなDataFrameがあるとします。私の特定のケースパンダでブロック平均を計算する方法DataFrame

a b c d e 
0 0.000000 0.000000 0.000000 0.000000 0.976492 
1 0.000000 3.589563 0.000000 0.400287 0.000000 
2 0.000000 0.000000 0.247323 0.000000 0.000000 
3 0.000000 0.000000 0.000000 0.079501 0.000000 
4 0.136868 0.000000 0.223572 0.153744 0.000000 
5 0.000000 0.000000 0.494390 0.311590 0.000000 
6 0.000000 0.000000 0.756897 0.000000 0.039769 
7 0.000000 0.000000 0.000000 1.006561 0.000000 
8 0.651060 0.588797 0.000000 0.000000 0.028943 
9 1.040841 0.000000 0.000000 0.000000 0.879489 

df = pd.DataFrame(np.random.randn(10,5), columns=['a','b','c','d','e']) 
idx = np.random.randint(0,2,(10,5)) 
df = abs(df * idx) 

私は非ゼロの各ブロックの手段を計算したいと思います。例えば、第二の最後の列(D列)はフォームの一連を生じる全

0 0.000000 
1 0.400287 
2 0.000000 
3 0.11662267564906763 
4 0.11662267564906763 
5 0.11662267564906763 
6 0.000000 
7 1.006561 
8 0.000000 
9 0.000000 

解明:

私は非ゼロのブロックが意味することは、任意の列のためのものです、連続した非ゼロエントリーを持つブロック。たとえば、列aは2つのブロックを持ち、1つはインデックス= 4、値= 0.136868で発生し、もう1つはインデックス= 8,9および値= [0.651060,1040841]で発生します。私は各ブロックの平均が欲しい。

解明2:カラムの場合 は、出力は、位置8,9、最後の2つのエントリの平均値が得られる

0 0.000000 
1 0.000000 
2 0.000000 
3 0.000000 
4 0.136868 
5 0.000000 
6 0.000000 
7 0.000000 
8 0.8459504999999999 
9 0.8459504999999999 

あろう。

+0

「各ゼロ以外のブロックの平均」の説明ができますか?ゼロブロックでないと出力が「0」になるのはなぜですか? – jezrael

+0

@jezrael私の更新を見てください。ありがとう! – zsljulius

+0

ありがとうございます。しかし、なぜ出力が '(float1、float2、float3、float4、float5)、index = ['a'、 'b'、 'c'、 'd'、 'e']))'?なぜなら、必要数は列単位であるからです。 – jezrael

答えて

2

最初df1DataFrame.cumsumDataFrame.shiftによってconsecutives値のグループを取得することができます。そして、

a = df != 0 
df1 = (a != a.shift()).cumsum() 
print (df1) 
    a b c d e 
0 1 1 1 1 1 
1 1 2 1 2 2 
2 1 3 2 3 2 
3 1 3 3 4 2 
4 2 3 4 4 2 
5 3 3 4 4 2 
6 3 3 4 5 3 
7 3 3 5 6 4 
8 4 4 5 7 5 
9 4 5 5 7 5 

groupbydf1からグループごとにdfから列によってtransformで:

print (df.a.groupby([df1.a]).transform('mean')) 
0 0.000000 
1 0.000000 
2 0.000000 
3 0.000000 
4 0.136868 
5 0.000000 
6 0.000000 
7 0.000000 
8 0.845951 
9 0.845951 
Name: a, dtype: float64 

の必要出力した場合すべての列でリスト内包を使用するconcat

df2 = pd.concat([df[col].groupby([df1[col]]).transform('mean') for col in df], axis=1) 
print (df2) 
      a   b   c   d   e 
0 0.000000 0.000000 0.000000 0.000000 0.976492 
1 0.000000 3.589563 0.000000 0.400287 0.000000 
2 0.000000 0.000000 0.247323 0.000000 0.000000 
3 0.000000 0.000000 0.000000 0.181612 0.000000 
4 0.136868 0.000000 0.491620 0.181612 0.000000 
5 0.000000 0.000000 0.491620 0.181612 0.000000 
6 0.000000 0.000000 0.491620 0.000000 0.039769 
7 0.000000 0.000000 0.000000 1.006561 0.000000 
8 0.845951 0.588797 0.000000 0.000000 0.454216 
9 0.845951 0.000000 0.000000 0.000000 0.454216 
関連する問題