2014-03-13 43 views
0

下面的代碼在熊貓12.0上爲我工作,但在熊貓13上不再有效(每個記錄的處理時間@ 1分鐘,以前的200k條記錄是在一個小時左右處理)。熊貓數據框 - 增加多索引數據框中某個時間範圍子集的值

我懷疑有一個更優雅的方式來實現相同的結果。如果有人能指引我朝着正確的方向,那會很好。

我創建像這樣的數據框:

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 

我增加值是這樣的:

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 

^^這是最後它用來做工精細,一個月前這一部分,但現在研磨至停下來。在還有老版熊貓的不同機器上,處理速度是可以接受的。

做這個增量的正確方法是什麼?

+0

你的榜樣的第二部分有很多未定義的變量。請製作一個可複製的例子。 – 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開始移動,直到我擁有具體的替代:) – Sylvansight

+0

好吧,這不是你的例子。如果你用所有的nans開始,那麼在你的開始條件下這將起作用(因爲cumsum基本上將忽略nans) – Jeff

相關問題