2016-11-22 6 views
2

Disons que j'ai un dataframe:Comment obtenir une tabulation croisée avec un tableau croisé de pandas qui afficherait la fréquence de plusieurs valeurs d'une variable de colonne?

df = pd.DataFrame(np.random.randint(0,5, size=(5,6)), columns=list('ABCDEF')) 

variables croisement avec pd.crosstab est assez simple:

table = pd.crosstab(index=df['A'], columns=df['B']) 

Rendement:

B 1 2 3 4 
A    
0 1 0 0 0 
1 0 0 0 1 
2 0 1 1 0 
3 0 1 0 0 

Où je par exemple vouloir une table comme celui-ci :

B (1+2+3) 1 2 3 4 
A    
0  1 1 0 0 0 
1  0 0 0 0 1 
2  2 0 1 1 0 
3  1 0 1 0 0 

Quelqu'un peut-il me mettre sur la bonne voie ici?

+1

Il y a de bonnes réponses à eu. Cependant, j'ai du mal à comprendre ce que je veux. Simplifiez votre exemple et montrez-nous ce que vous attendez de voir. Cela signifie que vous devez calculer manuellement votre auto afin que nous puissions voir votre logique. – piRSquared

+0

J'ai mis à jour ma question, j'espère que c'est logique maintenant. – pasitrauk

Répondre

2

Utilisez sum avec le sous-ensemble, mais si vous utilisez un petit df aléatoire, il peut y avoir un problème, vous obtenez toujours une autre valeur pour que les valeurs des colonnes soient différentes. Si l'utilisation np.random.seed(100) obtient la même sortie de test que ma réponse.

table['(1+2+3)'] = table[[1,2,3]].sum(axis=1) 

Exemple:

np.random.seed(100) 
df = pd.DataFrame(np.random.randint(0,5, size=(5,6)), columns=list('ABCDEF')) 
table = pd.crosstab(index=df['A'], columns=df['B']) 
table['(1+2+3)'] = table[[1,2,3]].sum(axis=1) 
print (table) 
B 0 1 2 3 4 (1+2+3) 
A       
0 1 0 0 0 1  0 
1 0 0 0 1 0  1 
2 0 0 1 0 0  1 
3 0 1 0 0 0  1 
+0

Merci, exactement ce que je cherchais! – pasitrauk