2014-03-13 1 views
0

다음 코드는 팬더 12.0에서 작동했지만 팬더 13에서는 더 이상 작동하지 않습니다 (레코드 당 1 분의 처리 시간, 이전의 200k 레코드는 1 시간 내에 처리됩니다.)pandas dataframe - 다중 인덱스 데이터 프레임에서 시간 프레임 하위 집합의 값 증가

같은 결과를 얻는보다 우아한 방법이 있다고 생각합니다. 누군가가 올바른 방향으로 나를 가리킬 수 있다면 좋을 것입니다. 그것은 한 달 전에 잘 작동하는 사용이 마지막 부분입니다 ^^

startDate = time.ctime(time.mktime(time.strptime(meh,"%d/%m/%Y %H:%M:%S"))) 
TempRng = pd.date_range(startDate, periods=75) 
for eachDay in TempRng: 
    df_sub.ix[eachDay,pubID]['variableA'] +=1 
    df_sub.ix[eachDay,pubID]['variableB'] += 5 

,하지만 지금에 갈기 :이 같은 값을 증가

pubs = ['pub1','pub2','pub3','pub4','pub5'] 

panel = pd.Panel(np.random.randn(2,2200,5), items=['variableA','variableB'], major_axis=pd.date_range('20110101', periods=2200), minor_axis=pubs) 
df_sub = panel.to_frame() 
df_sub.ix[:] = 0 

:

는 그래서 같은 dataframe를 만들 정지. 이전 버전의 판다가있는 다른 컴퓨터에서는 처리 속도가 허용됩니다.

이 증가분을 만드는 올바른 방법은 무엇입니까?

+0

귀하의 예제의 두 번째 부분 정의되지 않은 많은 변수를 가지고 직접 색인이 작업을 수행 할 수 (및 설정)됩니다. pls는 복사 할 수있는 예제를 만듭니다. – Jeff

+0

안녕하세요, Jeff 님, 대부분의 변수를 수정했습니다. PubID는 맨 위에있는 pubs [] 목록의 단일 값입니다. – Sylvansight

답변

2

당신이하고있는 일을 뒤집어 소수의 술집에서 반복합니다. 이것은 엄청난 규모의 순서 일 것입니다. Ix/loc은 큰 범위/슬라이스를 설정할 때 매우 빠릅니다. 적은 수의 변경으로 여러 번 사용하면 비효율적입니다.

In [57]: df = df_sub.reset_index() 

In [58]: mask = df.minor == 'pub1' 

In [59]: df.loc[mask,'variableA'] = 1 

In [60]: df.loc[mask,'variableB'] = 5 

In [61]: df.loc[mask,'variableA'] = df.loc[mask,'variableA'].cumsum() 

In [62]: df.loc[mask,'variableB'] = df.loc[mask,'variableB'].cumsum() 

In [64]: df.set_index(['major','minor']).head(20) 
Out[64]: 
        variableA variableB 
major  minor      
2011-01-01 pub1   1   5 
      pub2   0   0 
      pub3   0   0 
      pub4   0   0 
      pub5   0   0 
2011-01-02 pub1   2   10 
      pub2   0   0 
      pub3   0   0 
      pub4   0   0 
      pub5   0   0 
2011-01-03 pub1   3   15 
      pub2   0   0 
      pub3   0   0 
      pub4   0   0 
      pub5   0   0 
2011-01-04 pub1   4   20 
      pub2   0   0 
      pub3   0   0 
      pub4   0   0 
      pub5   0   0 

[20 rows x 2 columns] 

0.14에서는 2 수준

idx = pd.IndexSlice 

df_sub.loc[idx[:,'pub1'],:] = 1 
+0

그건 내가 성취하려고하는 것이 아닙니다. 나는 그 위치에 이미있는 값이 무엇이든 + 1/+5를 찾고있었습니다. 하지만 시간을내어 주셔서 감사합니다.이 방법을 보여 주시면 감사하겠습니다. 필요한 것을 얻으려면이 방법을 사용할 수 있는지 확인해보십시오. (그때까지는 다른 기계에 큰 스티커를 붙여 12.0에서 12.0으로 이동하지 않도록 상기 시키십시오. 구체적인 대안 : – Sylvansight

+0

좋아, 그게 당신의 예제가하지 않습니다. 당신이 모든 사람들과 함께 시작한다면, 당신의 시작 조건을 넣어 주면됩니다 (cumsum은 기본적으로 사람들을 무시할 것입니다) – Jeff

관련 문제