2016-10-24 4 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) 

.

명확화
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 

: 예를 들어, 제 마지막 열 (D 열) 폼 일련 수득 것 I은 비 - 제로 블록 무슨 뜻인지

이다 그런 특정 열에 대해 연속적인 0이 아닌 항목이있는 블록. 예를 들어, 열 a는 2 개의 블록을 가지며, 하나는 index = 4, value = 0.136868에서 발생하고 다른 하나는 index = 8,9 및 value = [0.651060,1040841]에서 발생합니다. 나는 각 블록의 평균을 원한다.

명확화 2 컬럼 (A)의 경우 는 출력 위치 8,9 마지막 두 항목의 평균값을 산출

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이 아닌 각 블록의 의미'에 대해 자세히 설명 할 수 있습니까? 왜 0 블록이 아닌 경우 출력이 '0'입니까? – jezrael

+0

@ jezrael 제 업데이트를 한번보세요. 감사! – zsljulius

+0

감사합니다. 그러나 출력이 왜''(float1, float2, float3, float4, float5), index = [ 'a', 'b', 'c', 'd', 'e']))'? 필요성 계산은 열을 의미하기 때문에? – jezrael

답변

2

먼저 DataFrame.cumsumdf1에 함께 DataFrame.shift에 의해 개의 연속 값 그룹을 얻을 수 있습니다 : 다음

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 

groupby을 열을 기준으로 그룹 당 df에서 df1에서 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 :

으로 목록 이해력을 사용합니다.3210
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 
관련 문제