假设我有以下数据:
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()))
如果有人有(更)优雅的解决方案,我将竭诚欢迎!