如何简便统计DataFrame中两列的非空组合类型数量?
统计DataFrame中两列非空组合数量的简便方法
核心思路
利用pandas的notna()/isna()方法判断列的非空状态,通过逻辑运算组合每行的状态,再直接求和或分组统计数量。
示例代码
首先还原示例DataFrame:
import pandas as pd import numpy as np df = pd.DataFrame({ 'id': [1,1,2,2,2,3,3], 'testA': [3,1,2,np.nan,0,np.nan,1], 'testB': [np.nan,3,np.nan,1,0,np.nan,1] })
方法一:直接统计各组合
通过逻辑条件直接计算每行是否符合目标状态,再求和:
# 统计各类组合数量 both_valid = (df['testA'].notna() & df['testB'].notna()).sum() only_a_valid = (df['testA'].notna() & df['testB'].isna()).sum() only_b_valid = (df['testA'].isna() & df['testB'].notna()).sum() both_null = (df['testA'].isna() & df['testB'].isna()).sum() # 输出结果 print(f"两列均有值: {both_valid}") print(f"仅testA有值: {only_a_valid}") print(f"仅testB有值: {only_b_valid}") print(f"两列均为空: {both_null}")
运行结果:
两列均有值: 3 仅testA有值: 2 仅testB有值: 1 两列均为空: 1
方法二:标签分组统计(更灵活)
给每行打上状态标签,再用value_counts()统计各标签的数量:
from numpy import select # 定义状态判断条件和对应标签 conditions = [ df['testA'].notna() & df['testB'].notna(), df['testA'].notna() & df['testB'].isna(), df['testA'].isna() & df['testB'].notna(), df['testA'].isna() & df['testB'].isna() ] labels = ['两列均有值', '仅testA有值', '仅testB有值', '两列均为空'] # 添加状态列并统计 df['status'] = select(conditions, labels) count_result = df['status'].value_counts() print(count_result)
运行结果:
两列均有值 3 仅testA有值 2 两列均为空 1 仅testB有值 1 Name: status, dtype: int64
说明
两种方法都避免了循环,利用pandas的向量化运算,处理大数据集时效率更高。如果只需要特定组合的数量,方法一更直接;如果需要扩展更多状态分类,方法二更灵活。
内容的提问来源于stack exchange,提问作者Economist_Ayahuasca
相关产品推荐
相关产品推荐

