在Pandas(Python)中获得按频率划分的百分比



假设我有以下数据:

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

我想做的是通过聚合创建一个数据帧,显示按状态划分的"M"one_answers"F"。现在我可以得到每个类别对的频率,结果是:

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

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

我对这个问题的第一个问题是,我如何才能让上一张表也显示CA有0个Fs,AZ有0个Ms的事实。理想情况下,我希望有如下所示的内容:

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

这接近于我所需要的,但它不能处理频率和某个类别为零的实例。有人能帮忙吗?

好吧,它一点也不优雅,但我想它确实做到了。从你对数据帧的定义开始,这对我来说很有效:

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()))

如果有人有(更)优雅的解决方案,我将竭诚欢迎!

最新更新