2017-08-06 4 views
2

J'ai un ensemble de données ci-dessous:Mise chaque élément Pandas crosstab

a,b,c 
1,1,1 
1,1,1 
1,1,2 
2,1,2 
2,1,1 
2,2,1 

J'ai créé un tableau croisé avec pandas géants:

cross_tab = pd.crosstab(index=a, columns=[b, c], rownames=['a'], colnames=['b', 'c']) 

mon tableau croisé est donnée en sortie:

b  1  2 
c  1 2 1 
a   
1  2 1 0 
2  1 1 1 

Je veux parcourir ce tableau croisé pour chaque valeur a, b et c. Comment puis-je obtenir des valeurs telles que cross_tab[a=1][b=1, c=1]? Je vous remercie.

Répondre

2

Vous pouvez utiliser slicers:

a,b,c = 1,1,1 
idx = pd.IndexSlice 
print (cross_tab.loc[a, idx[b,c]]) 
2 

Vous pouvez également remodeler df par DataFrame.unstack, reorder_levels puis utilisez loc:

a = cross_tab.unstack().reorder_levels(('a','b','c')) 
print (a) 
a b c 
1 1 1 2 
2 1 1 1 
1 1 2 1 
2 1 2 1 
1 2 1 0 
2 2 1 1 
dtype: int64 

print (a.loc[1,1,1]) 
2 
+0

Remerciez vous pour votre un swer. J'ai un autre problème maintenant. Il renvoie une erreur si je donne print (cross_tab2.loc [2,2,2]). Comment puis-je obtenir les valeurs de a, b et c dans un tableau croisé? – user3104352

+0

Voulez-vous boucler par 'a'? Ou si 'print (cross_tab2.loc [2,2,2])' quelle est la sortie désirée? – jezrael

+0

En fait, je veux boucler toutes les combinaisons possibles pour a, b, c. Ou je peux faire une boucle pour toutes les valeurs de a, b, c qui existent dans le tableau croisé. – user3104352

1

Vous recherchez df2.xxx.get_level_values:

In [777]: cross_tab.loc[cross_tab.index.get_level_values('a') == 1,\ 
         (cross_tab.columns.get_level_values('b') == 1)\ 
         & (cross_tab.columns.get_level_values('c') == 1)] 
Out[777]: 
b 1 
c 1 
a 
1 2