下面的代码在pandas 12.0上为我工作,但是在pandas 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 :(得分: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中,您可以直接索引(并设置)第二级
idx = pd.IndexSlice
df_sub.loc[idx[:,'pub1'],:] = 1