如何在排除 NaN 的同时对一列进行分组并计算其他列的总数?

How to groupby a column and count total numbers of other columns while excluding NaN?

df = pd.DataFrame(
        {'ST': list('AABBBC'), 
         'NO': [5.3, 1.2, np.nan, 2.3, 4.2, 1.5],
         'CO':[3.4,np.nan, 4.1, 2.5,np.nan, 3.6]})
print (df)
  ST   NO   CO
0  A  5.3  3.4
1  A  1.2  NaN
2  B  NaN  4.1
3  B  2.3  2.5
4  B  4.2  NaN
5  C  1.5  3.6

如何在 Python 中排除 NaN 的同时对列进行分组并计算其他列的总数?

使用 GroupBy.count for count values excluding NaNs and reshape by DataFrame.stack - 输出为 MultiIndex Series:

s = df.groupby('ST').count().stack()
print (s)
ST    
A   NO    2
    CO    1
B   NO    2
    CO    2
C   NO    1
    CO    1
dtype: int64

如果需要DataFrame:

df1 = df.groupby('ST').count().stack().rename_axis(('ST','NEW')).reset_index(name='VAL')
print (df1)
  ST NEW  VAL
0  A  NO    2
1  A  CO    1
2  B  NO    2
3  B  CO    2
4  C  NO    1
5  C  CO    1
df = pd.DataFrame(
        {'ST': list('AABBBC'), 
         'NO': [5.3, 1.2, np.nan, 2.3, 4.2, 1.5],
         'CO':[3.4,np.nan, 4.1, 2.5,np.nan, 3.6]})

您也可以结合使用熔化和 pivot_table 函数分两步完成此操作: 使用熔化函数重新格式化数据框的形状

cols=['NO','CO'] 

df_melt=pd.melt(df,id_vars=['ST'],value_vars=cols) 

然后使用数据透视表table创建一个新的数据框并计算值

df_pivot=pd.pivot_table(df_melt,index=['ST','variable'],values='value',aggfunc='count').reset_index() 

Result:
    ST  variable    value
0   A   CO  1
1   A   NO  2
2   B   CO  2
3   B   NO  2
4   C   CO  1
5   C   NO  1