2016-10-12 1 views
2

J'utilise la structure de données de panneau dans les pandas pour stocker un panneau 3d. Par la suite, j'essaie de mettre à jour (incrémenter) les valeurs stockées à des emplacements individuels à l'intérieur d'une boucle. Actuellement je fais:Pandas mise à jour des données du panneau

u=T.get_value(n1_loop,n2_loop,n3_loop) 
T.set_value(n1_loop,n2_loop,n3_loop,u+1) 

Ma question- est-ce la manière la plus simple? Y a-t-il un autre moyen plus simple? Les travaux de Do not suivante:

T[n1_loop,n2_loop,n3_loop] +=1 

ou

T[n1_loop,n2_loop,n3_loop] = T[n1_loop,n2_loop,n3_loop] +1 

Répondre

1

TL; DR

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

L'exercice analogue pour un dataframe serait d'attribuer à 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


exacte analogique pd.Panel génère une erreur

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! 

Mais nous pouvons couper encore

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 

Et nous pouvons utiliser la update method

pn.update(pn.loc['b':'d', list('AE'), ['X']].add(1)) 

Ce que nous pouvons voir des choses a fait si nous utilisons la méthode to_frame

pn.to_frame().astype(int) 

enter image description here

OU

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

enter image description here


VOTRE CAS
Cela devrait fonctionner

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

en quelque sorte je reçois cette erreur: – dayum

+0

en quelque sorte je reçois cette erreur en essayant T.update (T.loc [n1_loop, n2_loop, n3_loop].add (1)) AttributeError: l'objet 'numpy.float64' n'a pas d'attribut 'ajouter' – dayum

+0

@dayum J'ai supposé que vos variables de boucle étaient des listes. – piRSquared