python - 对于给定列中的每个不同值,计算另一列中的空值和非空值
问题描述
假设我有以下数据框:
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])
然后,我手动更改了 和 中df1
的df1 = 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()
,只有当有非空值时才会给我结果。
解决方案
让我们尝试crosstab
创建一个频率表,其中索引是列中的唯一值,col1
列表示对应counts
的non-nan
和nan
中的值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
推荐阅读
- php - 数组迭代中的 stdClass 对象
- google-cloud-platform - 如何在 BigQuery 中按结构分组?
- ibm-cloud - 通过 HTTP 调用 IBM Function
- laravel - laravel 5.7 重定向到同一页面到一个部分 ID
- laravel - Spatie/Laravel cors 生产中的问题
- java - 如何处理 UDP dns 请求
- php - 内容类型图像和 pdf 之间的不同行为
- c++ - 为什么这个可滚动区域不能保持我想要的图像大小?
- android - 读取上传的文件时出现 FileNotFoundException
- vba - 将图表复制并粘贴到电子邮件 VBA 正文中