You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何简便统计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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 16:05:25