2016-02-29 34 views
1

绘制百分比对于一个数据帧的Python:在seaborn柱状图中

import pandas as pd 
df=pd.DataFrame({'group':list("AADABCBCCCD"),'Values':[1,0,1,0,1,0,0,1,0,1,0]}) 

我想绘制的时间A, B, C, D一个barplot显示比例接受零(或一个)。

我有一个围着它的工作方式,但我想,必须有更直接的方式

tempdf=df.groupby(['group','Values']).Values.count().unstack().fillna(0) 
tempdf['total']=df['group'].value_counts() 
tempdf['percent']=tempdf[0]/tempdf['total']*100 

tempdf.reset_index(inplace=True) 
print tempdf 

sns.barplot(x='group',y='percent',data=tempdf) 

如果阴谋只是平均值,我可以简单地做sns.barplot上比tempdf df数据帧。如果我对绘制百分比感兴趣,我不确定如何优雅地做到这一点。

感谢,

回答

2

你可以使用自己的功能sns.barplotestimator,从docs

估计:调用该地图矢量 - >标量,可选
统计功能内估计每个分类箱。

对于你情况下你可以定义功能的λ:

sns.barplot(x='group', y='Values', data=df, estimator=lambda x: sum(x==0)*100.0/len(x)) 

enter image description here

+0

感谢@anton。这工作几乎完美。除了给出没有浮点值的小问题,但包括'1.0'作品'sns.barplot(x ='group',y ='Values',data = df,estimator = lambda x:sum(x == 0 )* 1.0/len(x))' – PagMax

+0

@PagMax我使用Python 3.x,所以我没有,如果你使用python 2,你应该像你一样添加'1.0'或者if你需要百分比,你可以乘以100.0。 –

+0

谢谢,我明白不同之处。是的,我正在使用python'2.x',并且乘以'100.0'也可以,但是必须在像sum(x == 0)* 100.0/len(x)'而不是'sum( X == 0)/ LEN(x)的* 100.0'。无论如何,问题解决了,非常感谢你的帮助。 – PagMax