Pandas groupby将非空值计为百分比

时间:2017-11-08 01:53:57

标签: python pandas

鉴于此数据集,我想计算缺少的NaN值:

df = pd.DataFrame({'A' : [1, np.nan, 2 , 55, 6, np.nan, -17, np.nan],
                   'Team' : ['one', 'one', 'two', 'three','two', 'two', 'one', 'three'],
                   'C' : [4, 14, 3 , 8, 8, 7, np.nan, 11],
                   'D' : [np.nan, np.nan, -12 , 12, 12, -12, np.nan, np.nan]})

具体来说,我想计算“团队”中每个群体的百分比(百分比)。柱。我可以通过这个得到原始数:

df.groupby('Team').count()

这将获得非缺失数字的数量。我想要做的是创建一个百分比,所以不是得到原始数字,而是将其作为每个组中总条目的百分比得到它(我不知道所有组的大小都是不均匀的) 。我尝试过使用.agg(),但我似乎无法得到我想要的东西。我怎么能这样做?

2 个答案:

答案 0 :(得分:6)

您可以使用mean布尔数据框的notnull

analog([A], H)

和groupby:

In [11]: df.notnull()
Out[11]:
       A      C      D  Team
0   True   True  False  True
1  False   True  False  True
2   True   True   True  True
3   True   True   True  True
4   True   True   True  True
5  False   True   True  True
6   True  False  False  True
7  False   True  False  True

In [12]: df.notnull().mean()
Out[12]:
A       0.625
C       0.875
D       0.500
Team    1.000
dtype: float64

如果没有首先使用In [13]: df.groupby("Team").apply(lambda x: x.notnull().mean()) Out[13]: A C D Team Team one 0.666667 0.666667 0.0 1.0 three 0.500000 1.000000 0.5 1.0 two 0.666667 1.000000 1.0 1.0 申请,可能会更快:

set_index

答案 1 :(得分:1)

根据您自己的代码添加div(df.groupby('Team').size(),0)

df.groupby('Team').count().div(df.groupby('Team').size(),0)
Out[190]: 
              A         C    D
Team                          
one    0.666667  0.666667  0.0
three  0.500000  1.000000  0.5
two    0.666667  1.000000  1.0