2016-09-08 4 views
-1

Wie kann ich einen gruppenweisen Prozentsatz in Pandas berechnen?Pandas groupwise Prozentsatz

ähnlich wie Pandas: .groupby().size() and percentages oder Pandas Very Simple Percent of total size from Group by Ich möchte den Prozentsatz eines Wertes pro Gruppe berechnen.

Wie kann ich das erreichen?

My-Datensatz aufgebaut ist wie

ClassLabel, Field 

Zunächst aggregieren ich auf beiden ClassLbel und Field wie

grouped = mydf.groupby(['Field', 'ClassLabel']).size().reset_index() 
grouped = grouped.rename(columns={0: 'customersCountPerGroup'}) 

Nun würde Ich mag den Prozentsatz der Kunden in jeder Gruppe pro Gruppe auf ein wissen Basis. Die Gruppengesamtheit kann erhalten werden wie mydf.groupby(['Field']).size(), aber ich kann das weder als eine Spalte verschmelzen, noch bin ich sicher, dass dies der richtige Ansatz ist - es muss etwas einfacher sein.

bearbeiten

Ich möchte nur um den Prozentsatz berechnen auf einer einzigen Gruppe basiert z.B. 3 0 0.125 1 0.250 die Summe von 0 + 1 -> 0.125 + 0.250 = 0.375 und diesen Wert verwenden, um devide/normalisieren gruppiert und nicht grouped.sum() enter image description here

Antwort

4

IIUC können Sie:

mydf = pd.DataFrame({'Field':[1,1,3,3,3], 
        'ClassLabel':[4,4,4,4,4], 
        'A':[7,8,9,5,7]}) 

print (mydf) 
    A ClassLabel Field 
0 7   4  1 
1 8   4  1 
2 9   4  3 
3 5   4  3 
4 7   4  3 

grouped = mydf.groupby(['Field', 'ClassLabel']).size() 
print (grouped) 
Field ClassLabel 
1  4    2 
3  4    3 
dtype: int64 

print (100 * grouped/grouped.sum()) 
Field ClassLabel 
1  4    40.0 
3  4    60.0 
dtype: float64 

grouped = mydf.groupby(['Field', 'ClassLabel']).size().reset_index() 
grouped = grouped.rename(columns={0: 'customersCountPerGroup'}) 
print (grouped) 
    Field ClassLabel customersCountPerGroup 
0  1   4      2 
1  3   4      3 

grouped['per'] = 100 * grouped.customersCountPerGroup/grouped.customersCountPerGroup.sum() 
print (grouped) 
    Field ClassLabel customersCountPerGroup per 
0  1   4      2 40.0 
1  3   4      3 60.0 

EDIT von Kommentar:

mydf = pd.DataFrame({'Field':[1,1,3,3,3,4,5,6], 
        'ClassLabel':[0,0,0,1,1,0,0,6], 
        'A':[7,8,9,5,7,5,6,4]}) 

print (mydf) 

grouped = mydf.groupby(['Field', 'ClassLabel']).size() 
df = grouped/grouped.sum() 

df = (grouped/df.groupby(level=0).transform('sum')).reset_index(name='new') 
print (df) 
    Field ClassLabel  new 
0  1   0 8.000000 
1  3   0 2.666667 
2  3   1 5.333333 
3  4   0 8.000000 
4  5   0 8.000000 
5  6   6 8.000000 
+0

aber wenn ich will nicht 'grouped.sum() verwenden,' aber wirklich diesen operat ausführen Ionen für jede Gruppe getrennt z.B. Verwenden Sie die Summe von Klasse 0 und Klasse 1 für Feld 1 als Summe. Wie kann ich darauf zugreifen? –

+0

Sorry, können Sie es zur Frage hinzufügen, was ist die gewünschte Ausgabe von Eingabe? Am besten ist, ändern oder verwenden Sie meine Probe oder erstellen Sie eine andere, weil ich nicht sicher bin, ob ich dich verstehe. – jezrael

+0

siehe bitte bearbeiten. –