如何分组列并计算其他列的总数,同时排除NaN?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何分组列并计算其他列的总数,同时排除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

enter image description here

如何组合列并计算其他列的总数,同时在Python中排除NaN?

答案

使用GroupBy.count计算除NaNs和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) 

然后使用数据透视表创建新的数据框和计数值

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

以上是关于如何分组列并计算其他列的总数,同时排除NaN?的主要内容,如果未能解决你的问题,请参考以下文章

如何取消透视多个列并从任一列中排除值?

如何按内容拉伸表格的一列并相应地减小其他列的宽度?

如何根据其他列的某些值替换列的nan值

mybatis单表分组查询如何返回总数,最大值等,同时要返回分组条件

如何选择列并为不存在的列生成 Nan 值?

来自有条件和无条件列的 SQL 查询分组的比率或百分比