2016-08-04 8 views
1

Ich habe einen Datenrahmen wie dies in Pandas:Normierte Werte erhalten, gewichtet mit einer anderen Spalte?

df = pd.DataFrame({ 
    'org': ['A1', 'B1', 'A1', 'B2'], 
    'DIH': [True, False, True, False], 
    'Quantity': [10,20,10,20], 
    'Items': [1, 2, 3, 4] 
}) 

Jetzt habe ich durch die Anzahl der Items der Wert zählt und Modalwert Quantity, sondern gewichtet erhalten möchten.

So weiß ich, dass ich

df.groupby('Quantity').agg({'Items': 'sum'}).sort_values('Items', ascending=False) 

tun kann dies Und bekommen:

Quantity Items 
20   6 
10   4 

Aber wie bekomme ich diese als Prozentwert, wie das?

Quantity Items 
20   60 
10   40 

Antwort

0

Nur noch eine Zeile Code hinzufügen:

df2 = df.groupby('Quantity').agg({'Items': 'sum'}).sort_values('Items', ascending=False) 
df2['Items']=(df2['Items']*100)/df2['Items'].sum() 

print (df2) 
Output : 
       Items 
Quantity  
20   60.0 
10   40.0 
2

Dieser arbeitete für mich

df.groupby('Quantity').agg({'Items': 'sum'}).sort_values('Items', ascending=False)/df['Items'].sum()*100 
0

versuchen, diese statt (eine Zeile):

df.groupby('Quantity').agg({'Items': 'sum'}).sort_values('Items', ascending=False).apply(lambda x: 100*x/float(x.sum())) 
1

Wenn es ist von einigem Interesse, hier eine Funktion, die einen Datenrahmen als Eingabe und Ausgabe nimmt t ein gewichteter Wert zählt (normalisiert oder nicht).

def weighted_value_counts(x, *args, **kwargs): 
    normalize = kwargs.get('normalize', False) 
    c0 = x.columns[0] 
    c1 = x.columns[1] 
    xtmp = x[[c0,c1]].groupby(c0).agg({c1:'sum'}).sort_values(c1,ascending=False) 
    s = pd.Series(index=xtmp.index, data=xtmp[c1], name=c0) 
    if normalize: 
     s = s/x[c1].sum() 
    return s 

das Beispiel der Verwendung Frage, wobei die Gewichte Item in der Spalte sind.
Sie können Ihre gewichteten normalisierten Werte erhalten, indem Sie Folgendes tun:

weighted_value_counts(df[['Quantity','Item']], normalize=True) 
Verwandte Themen