PANDAS DATAFRAME-增加多数索引数据框架上时间范围子集的值



以下代码在PANDAS 12.0上对我有用,但是在Pandas 13上不再工作(每条记录1分钟处理时间 @1分钟,以前在一个小时左右的时间内处理了200k记录)。/p>

我怀疑有一种更优雅的方法可以实现相同的结果。如果有人可以将我指向正确的方向,那会很好。

我像这样创建数据框架:

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

i这样的增量值:

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

^^这是一个月前的最后一部分,但现在已经停止了。在仍然具有较旧版本的熊猫的其他机器上,处理速度是可以接受的。

进行此增量的正确方法是什么?

逆转您正在做的事情,并在少量的酒吧上迭代。这将是更快的阶数。设置大型/切片时,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中,您将能够直接索引(并设置)第二级

idx = pd.IndexSlice
df_sub.loc[idx[:,'pub1'],:] = 1

最新更新