2016-09-29 2 views
4

팬더 시리즈의 K 요소의 그룹에 기능을 적용나는 팬더 시리즈가

0  1 
1  5 
2 20 
3 -1 

내가 모든 두 가지 요소에 mean()을 적용 할 말할 수 있습니다를, 그래서 나는 이런 식으로 뭔가 얻을 :

0 3.0 
1 9.5 

우아한 방법이 있나요?

+0

내 게시물을 업데이트했습니다. – piRSquared

답변

3

당신은 k=2에 의해 index 분할에 의해 groupby를 사용할 수 있습니다

k = 2 
print (s.index // k) 
Int64Index([0, 0, 1, 1], dtype='int64') 

print (s.groupby([s.index // k]).mean()) 
    name 
0 3.0 
1 9.5 
+0

고마워요! k가 시리즈의 길이를 나눈 경우를 다루는 방법이 있습니까? 나는 시도했다 : (s [-m :]. index // k) k가 m을 나눌 때, 그러나 작동하지 않았다. –

+0

나는 그것을 잡을 것이라고 생각한다. 하지만 당신은 먼저'reset_index' -'s = s [-m :]. reset_index (drop = True)'그리고'print (s.groupby ([s.index // k]). – jezrael

+0

그래, 알았어 [(s.index + (k - (len (s) % k)) % k)) // k] –

1

당신이 큰 시리즈 여러 번에 걸쳐이를 사용하는 경우, 당신은 빠른 접근 방식을 고려할 수 있습니다. 이 솔루션은 모든 numpy 함수를 사용하며 빠릅니다.

사용 reshape 및 구성의 새로운 pd.Series

pd.Seriess

s = pd.Series([1, 5, 20, -1]) 

일반화 된 기능을 고려

def mean_k(s, k): 
    pad = (k - s.shape[0] % k) % k 
    nan = np.repeat(np.nan, pad) 
    val = np.concatenate([s.values, nan]) 
    return pd.Series(np.nanmean(val.reshape(-1, k), axis=1)) 

데모

mean_k(s, 2) 

0 3.0 
1 9.5 
dtype: float64 

mean_k(s, 3) 

0 8.666667 
1 -1.000000 
dtype: float64 
1

당신은이 작업을 수행 할 수 있습니다

(s.iloc[::2].values + s.iloc[1::2])/2 

을 당신도 나중에 인덱스를 재설정 할 수 있습니다 원하는 경우, 0을 그래서 1로 색인을 사용하여 :

((s.iloc[::2].values + s.iloc[1::2])/2).reset_index(drop=True) 
+0

내 나쁜, 조금 너무 빨랐다;) – Skirrebattie

+0

이것은 k = 2 경우에 효과적이지만 많은 k의 경우이 작업을 수행하고 싶습니다. –

+0

Mmmm은 여전히 ​​가능해야하지만, 나는 그것에 대해 조금 생각합니다. :) – Skirrebattie