2016-08-04 29 views
1

我有這樣一個數據幀中的熊貓:獲取由另一列加權的歸一化值計數?

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

現在我想獲得價值數和Quantity模態值,而是由Items數加權。

所以我知道我能做到

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

而得到這樣的:

Quantity Items 
20   6 
10   4 

但我怎麼得到這個爲百分比值,也是這樣嗎?

Quantity Items 
20   60 
10   40 

回答

0

只需再添加一行代碼:

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

這爲我工作

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

試試這個,而不是(一行):

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

如果它有一些興趣,這裏有一個函數將數據幀作爲輸入和輸出t加權值計數(標準化或不標準化)。

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 

使用問題的例子,其中權重在Item列中。
您可以通過下列方式獲得您的加權歸一化值計數:

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