Python 按百分比计算非空值

Python 按百分比计算非空值,python,pandas,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],

鉴于此数据集,我想计算缺失的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(),但似乎无法得到我想要的。如何执行此操作?

您可以使用布尔数据帧的:

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
还有groupby:

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\u index
执行此操作可能会更快,而无需应用:

In [14]: df.set_index("Team").notnull().groupby(level=0).mean()
Out[14]:
              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

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


谢谢,我喜欢这两种方法!非常感谢
set\u index()
解决方案,它为我节省了当前项目的时间!我以前没有见过div()函数;这真的很有用。谢谢
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