팬더

2014-07-14 13 views
2

와 범주 값에 창을 이동 나는이 같은 팬더 시리즈가 :팬더

s = pd.Series(["A", "A", "B", "C", "A", "C", "A", "C", "A", "B", "B", "B", "A", "A", "C"]) 

내가 계수 또는 크기의 비 중복 창에서 각 문자의 비율을 가지고 싶습니다을 4

pd.rolling_apply(s, 4, pd.value_counts) 

을하지만 그것은 작동하지 않습니다

나는이 함께했습니다.

ValueError: could not convert string to float: C 

이 작업을 수행하기위한 아이디어가 있습니까?

답변

0

멋진 퍼즐! for 루프를 사용하여 모든 창의 사전을 가져옵니다. 그런 다음 DataFrame을 만든 다음 value_counts()를 사용할 수 있습니다. 이게 당신이 요구 한 것입니까? .value_counts()를 위하여

print(s.index // 4) 
# => Int64Index([0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3], dtype='int64') 

그룹 및 사용 : 당신의 시리즈는 RangeIndex을 사용하기 때문에

In [150]: winsize = 4 

In [151]: for i in range(len(s)+1-winsize): wd[i] = s[i:i+winsize].tolist() 

In [152]: wd 
Out[152]: 
{0: ['A', 'A', 'B', 'C'], 
1: ['A', 'B', 'C', 'A'], 
2: ['B', 'C', 'A', 'C'], 
3: ['C', 'A', 'C', 'A'], 
4: ['A', 'C', 'A', 'C'], 
5: ['C', 'A', 'C', 'A'], 
6: ['A', 'C', 'A', 'B'], 
7: ['C', 'A', 'B', 'B'], 
8: ['A', 'B', 'B', 'B'], 
9: ['B', 'B', 'B', 'A'], 
10: ['B', 'B', 'A', 'A'], 
11: ['B', 'A', 'A', 'C']} 

In [153]: pd.DataFrame(wd) 
Out[153]: 
    0 1 2 3 4 5 6 7 8 9 10 11 
0 A A B C A C A C A B B B 
1 A B C A C A C A B B B A 
2 B C A C A C A B B B A A 
3 C A C A C A B B B A A C 

In [154]: pd.DataFrame(wd).apply(pd.value_counts) 
Out[154]: 
    0 1 2 3 4 5 6 7 8 9 10 11 
A 2 2 1 2 2 2 2 1 1 1 2 2 
B 1 1 1 NaN NaN NaN 1 2 3 3 2 1 
C 1 1 2 2 2 2 1 1 NaN NaN NaN 1 
+0

고마워, 내가 보게. 방금 겹치지 않는 창을 원했지만 그게 pb가 아닌 것 같습니다. 범위에 단계를 추가하면됩니다. – jrjc

1

, 당신은 그 크기로 나누어하여 겹치지 않는 창을 만들 수 있습니다

s.groupby(s.index // 4).value_counts() 

# 0 A 2 
# B 1 
# C 1 
# 1 A 2 
# C 2 
# 2 B 3 
# A 1 
# 3 A 2 
# C 1 
# dtype: int64 

계산식 대신 비율을 사용하려면 .value_counts() 인수를 normalize=True :

당신의 시리즈는 인덱스의 다른 종류를 한 경우에는 다음과 같이 3,691,363,210
s.groupby(s.index // 4).value_counts(normalize=True) 

# 0 A 0.500000 
# B 0.250000 
# C 0.250000 
# 1 A 0.500000 
# C 0.500000 
# 2 B 0.750000 
# A 0.250000 
# 3 A 0.666667 
# C 0.333333 
# dtype: float64 

, 당신은 여전히 ​​창을 생성 할 수 :

pd.Series(range(len(s))) // 4 

# 0  0 
# 1  0 
# 2  0 
# 3  0 
# 4  1 
# 5  1 
# 6  1 
# 7  1 
# 8  2 
# 9  2 
# 10 2 
# 11 2 
# 12 3 
# 13 3 
# 14 3 
# dtype: int64 

을 다음 두 줄의 상관 위와 같은 출력 결과 :

s.groupby(pd.Series(range(len(s))) // 4).value_counts() 
s.groupby(pd.Series(range(len(s))) // 4).value_counts(normalize=True)