2017-05-30 6 views
3

Ich habe zwei Kategorien A und B, die 5 verschiedene Zustände (Werte, Namen oder Kategorien) annehmen können, die durch die Liste abcde definiert sind. Es ist ziemlich einfach, das Auftreten jedes Zustands zu zählen und in einem Datenrahmen zu speichern. Allerdings möchte ich auch dem resultierenden Datenrahmen Nullen für die möglichen Werte enthalten, die nicht in Kategorie A oder BZähle Vorkommen bestimmter Werte in einem Datenrahmen, wobei alle möglichen Werte durch eine Liste definiert sind.

Zuerst aufgetreten sind, ist hier ein Datenrahmen, die die Beschreibung passt:

In [1]:

import pandas as pd 
possibleValues = list('abcde') 
df = pd.DataFrame({'Category A':list('abbc'), 'Category B':list('abcc')}) 
print(df) 

Out [1]:

 Category A  Category B 
0  a    a 
1  b    b 
2  b    c 
3  c    c 

ich verschiedene Ansätze mit df.groupby versucht habe (...) Größe() und .count(), mit der Liste der möglichen kombiniert. Werte und t er nennt die Kategorien in einer Liste, aber ohne Erfolg.

Hier ist die gewünschte Ausgabe:

 Category A  Category B 
a  1    1 
b  2    1 
c  1    2 
d  0    0 
e  0    0 

Um einen Schritt weiter zu gehen, würde ich auch in allen Kategorien für jeden möglichen Zustand eine Spalte mit den Summen enthalten mag:

 Category A  Category B  Total 
a  1    1    2 
b  2    1    3 
c  1    2    3 
d  0    0    0 
e  0    0    0 

SO hat viele verwandte Fragen und Antworten, aber meines Wissens keine, die eine Lösung für dieses spezielle Problem vorschlagen. Danke für Anregungen!

P. S

Ich mag würde die Lösung einstellbar auf die Anzahl der Kategorien zu machen, mögliche Werte und die Anzahl der Zeilen.

Antwort

3

Need apply + value_counts + reindex + sum:

cols = ['Category A','Category B'] 
df1 = df[cols].apply(pd.value_counts).reindex(possibleValues, fill_value=0) 
df1['total'] = df1.sum(axis=1) 
print (df1) 
    Category A Category B total 
a   1   1  2 
b   2   1  3 
c   1   2  3 
d   0   0  0 
e   0   0  0 

Eine andere Lösung ist Spalten zu categorical konvertieren und dann 0 Werte werden addiert, ohne reindex:

cols = ['Category A','Category B'] 
df1 = df[cols].apply(lambda x: pd.Series.value_counts(x.astype('category', 
                   categories=possibleValues))) 
df1['total'] = df1.sum(axis=1) 
print (df1) 
    Category A Category B total 
a   1   1  2 
b   2   1  3 
c   1   2  3 
d   0   0  0 
e   0   0  0 
Verwandte Themen