首页 > 解决方案 > 对于给定列中的每个不同值,计算另一列中的空值和非空值

问题描述

假设我有以下数据框:

df = pd.DataFrame({'col1':['x','y','z','x','x','x','y','z','y','y'],
                'col2':[np.nan,'n1',np.nan,np.nan,'n3','n2','n5',np.nan,np.nan,np.nan]})

对于每个不同的元素,col1我想计算其中可能有多少空值和非空值,col2并将结果汇​​总到一个新的数据框中。到目前为止,我使用df1 = df[df['col1']=='x']然后

print(df1[df1['col2'].isna()].shape[0],
df1[df1['col2'].notna()].shape[0])

然后,我手动更改了 和 中df1df1 = df[df['col1']=='y']df1 = df[df['col1']=='z']。然而我的方法根本没有效率。我想要的表应该如下所示:

  col1  value  no value
0    x      2         2
1    y      2         2
2    z      0         2

我也尝试过df.groupby('col1').col2.nunique(),只有当有非空值时才会给我结果。

标签: pythonpandasdataframe

解决方案


让我们尝试crosstab创建一个频率表,其中索引是列中的唯一值,col1列表示对应countsnon-nannan中的值col2

out = pd.crosstab(df['col1'], df['col2'].isna())
out.columns = ['value', 'no value']

>>> out

      value  no value
col1                 
x         2         2
y         2         2
z         0         2

推荐阅读