Pandas面板数据更新

3

我正在使用pandas中的面板数据结构来存储一个三维面板。

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
1个回答

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

enter image description here


精确的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方法
pn.update(pn.loc['b':'d', list('AE'), ['X']].add(1))

如果我们使用to_frame方法,我们可以看到它做了一些事情。
pn.to_frame().astype(int)

enter image description here

OR

pn.loc[:, :, 'X'].astype(int).T

enter image description here


你的案例
这应该可以工作

T.update(T.loc[[n1_loop], [n2_loop], [n3_loop]].add(1))

尝试执行 T.update(T.loc[n1_loop, n2_loop, n3_loop].add(1)) 时,我不知何故遇到了以下错误:AttributeError: 'numpy.float64' object has no attribute 'add' - dayum
@dayum 我假设你的循环变量是列表。 - piRSquared
抱歉可能之前应该提到,但n1_loop、n2_loop和n3_loop都是字符串(引用沿着三个轴的索引)。 - dayum
如果n1_loopitems索引的单个成员字符串,那么可以使用T.update(T.loc[[n1_loop], [n2_loop], [n3_loop]].add(1)) - piRSquared

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接