我在pandas中使用面板数据结构来存储3d面板。
T=pd.Panel(data=np.zeros((n1,n2,n3)),items=n1_label, major_axis=n2_label, minor_axis=n3_label)
稍后,我试图更新(增加)存储在循环内各个位置的值。目前我在做:
u=T.get_value(n1_loop,n2_loop,n3_loop)
T.set_value(n1_loop,n2_loop,n3_loop,u+1)
我的问题 - 这是最简单的方法吗?还有其他更简单的方法吗?以下不起作用:
T[n1_loop,n2_loop,n3_loop] +=1
或
T[n1_loop,n2_loop,n3_loop] = T[n1_loop,n2_loop,n3_loop] +1
答案 0 :(得分:1)
TL; DR
T.update(T.loc[[n1_loop], [n2_loop], [n3_loop]].add(1))
DataFrame的类似练习是使用loc
df = pd.DataFrame(np.zeros((5, 5)), list('abcde'), list('ABCDE'), int)
df.loc['b':'d', list('AE')] += 1
df
精确pd.Panel
模拟生成错误
pn = pd.Panel(np.zeros((5, 5, 2)), list('abcde'), list('ABCDE'), list('XY'), int)
pn.loc['b':'d', list('AE'), ['X']] += 1
pn
NotImplementedError: cannot set using an indexer with a Panel yet!
但我们仍然可以将其分割
pn = pd.Panel(np.zeros((5, 5, 2)), list('abcde'), list('ABCDE'), list('XY'), int)
pn.loc['b':'d', list('AE'), ['X']]
<class 'pandas.core.panel.Panel'>
Dimensions: 3 (items) x 2 (major_axis) x 1 (minor_axis)
Items axis: b to d
Major_axis axis: A to E
Minor_axis axis: X to X
我们可以使用update
method
pn.update(pn.loc['b':'d', list('AE'), ['X']].add(1))
如果我们使用to_frame
方法
pn.to_frame().astype(int)
<强> OR 强>
pn.loc[:, :, 'X'].astype(int).T
你的案例
这应该工作
T.update(T.loc[[n1_loop], [n2_loop], [n3_loop]].add(1))