首页 > 解决方案 > 如何计算每组的非空列?

问题描述

我从如下所示的原始数据开始:

  Case  Final    Pre    Post   
  1     A        Z      X  
        Z               V  
  2     B                  
        Y                  
  3     A        Z      Y  
        Z               U  
        W                  
  4     C        W        
        Z                  
  5     C        X      Z  
        X                  
        Z                 

然后做了一个前向填充:

df['Case'] = df['Case'].ffill()

像这样:

  Case  Final    Pre    Post   
  1     A        Z      X  
  1     Z        NaN    V  
  2     B        NaN    NaN
  2     Y        NaN    NaN
  3     A        Z      Y  
  3     Z        NaN    U  
  3     W        NaN    NaN
  4     C        W      NaN
  4     Z        NaN    NaN
  5     C        X      Z  
  5     X        NaN    NaN
  5     Z        NaN    NaN

我想要的是计算每列中该列不为空的案例数:

  Case: 5
  Final: 5
  Pre: 4
  Post: 3  

输出说明:

1- 按第一列分组Case

2-即使列的一个值不为空(包括Case列本身),然后 count++(将非空计数加 1)。

标签: pythonpandas

解决方案


利用:

s = df.notna().groupby(df['Case']).any().sum()
#oldier pandas versions
s = df.notnull().groupby(df['Case']).any().sum()
print (s)
Case     5
Final    5
Pre      4
Post     3
dtype: int64

详情

首先通过以下方式检查非缺失值DataFrame.notna

print (df.notna())
    Case  Final    Pre   Post
0   True   True   True   True
1   True   True  False   True
2   True   True  False  False
3   True   True  False  False
4   True   True   True   True
5   True   True  False   True
6   True   True  False  False
7   True   True   True  False
8   True   True  False  False
9   True   True   True   True
10  True   True  False  False
11  True   True  False  False

Case然后按列聚合GroupBy.any

print (df.notnull().groupby(df['Case']).any())
      Case  Final    Pre   Post
Case                           
1     True   True   True   True
2     True   True  False  False
3     True   True   True   True
4     True   True   True  False
5     True   True   True   True

以及 count s 进程的最后一个sum值,例如.True1


推荐阅读