2015-12-14 21 views
1

假設我有以下數據:在大熊貓得到一個百分比擊穿通過頻率(蟒蛇)

df = pd.DataFrame({ 
    'state':['CA', 'WA', 'CA', 'AZ','AZ','WA','WA','CA'], 
    'gender':['M','F','M','F', 'F','F','M','M'] 
}) 

我所試圖做的是通過創建一個聚合數據框,顯示「M'and‘F’按州分類。現在我能夠得到各類別對這些原來是頻率:

df.groupby(['state', 'gender']).size() 


state gender 
AZ  F   2 
CA  M   3 
WA  F   2 
     M   1 

我對這個問題的第一個問題就是我怎樣才能得到上表也顯示,CA有0 Fs的事實和AZ有0女士在理想情況下,我想有一個看起來像下面的內容:

state gender 
AZ  F   2 
     M   0 
CA  M   3 
     F   0 
WA  F   2 
     M   1 

最後,有什麼我試圖用這個做的是在該州建立一個基於頻率的故障率和全總。這將如下所示:

state gender 
AZ  F   100.00 
     M   0.00 
CA  M   100.00 
     F   0.00 
WA  F   66.66 
     M   33.33 

This接近我所需要的,但它不處理頻率以及其中某一類是零的情況。誰能幫忙?

回答

0

嗯,它遠非優雅,但它確實有我猜的竅門。與你的數據幀的定義出發,這個工作對我來說:

import pandas as pd 
import itertools 


df = pd.DataFrame({ 
     'state':['CA', 'WA', 'CA', 'AZ','AZ','WA','WA','CA'], 
     'gender':['M','F','M','F', 'F','F','M','M'] 
}) 

new_df = df.groupby(['state', 'gender']) \ 
    .size() \ 
    .reindex(list(itertools.product(set(df['state']), 
            set(df['gender']))), 
      fill_value=0) \ 
    .groupby(level=0) \ 
    .apply(lambda x: 100*x/float(x.sum())) 

如果任何人有一個(更多)優雅的解決方案,我會竭誠歡迎吧!