宽格式数据中如何循环列计算与Column C的非空值交集计数?
问题描述
数据集
我有如下宽格式数据集:
| Column A | Column B | Column C | Column D |
|---|---|---|---|
| A | B | ||
| F | C | D | |
| E | |||
| 2 | 2 | 1 | 1 |
需求
计算每一列与Column C同时不为空的行数,将结果作为“Intersection”行添加到数据框底部。例如:
- Column A与Column C的交集计数为0
- Column B与Column C的交集计数为1
尝试的代码及问题
我尝试的代码如下:
clmn=list(df) for i in clmn: df.loc('Intersection')=df[['Column C',i]].notna().all(1)
代码未报错,但“Intersection”行全为NA值。由于数据有200+列,需通过循环处理,希望得到正确的实现方法。
解决方案
你的代码存在两个核心问题:
- 索引行应该用方括号
df.loc['Intersection'],而非圆括号,圆括号是调用方法的语法,不适用于行索引赋值 - 当前代码仅生成了每行是否同时非空的布尔值,没有对这些布尔值求和得到最终计数
以下是两种可行的实现方式:
方式一:循环实现(适配你的需求场景)
# 获取所有列名 clmn = list(df.columns) # 初始化Intersection行 df.loc['Intersection'] = 0 for col in clmn: # 计算当前列与Column C同时不为空的行数 count = df[[col, 'Column C']].notna().all(axis=1).sum() # 赋值到Intersection行的对应列 df.loc['Intersection', col] = count
方式二:向量化实现(更高效,适合200+列的大数据量)
循环在列数极多时效率偏低,推荐用向量化操作完成:
# 计算每列与Column C同时非空的行数 intersection_counts = df.notna().mul(df['Column C'].notna(), axis=0).sum() # 将结果作为新行添加到数据框 df.loc['Intersection'] = intersection_counts
逻辑说明
df.notna()生成布尔值数据框,标记每个单元格是否非空mul(df['Column C'].notna(), axis=0)将每列的布尔值与Column C的布尔值逐行相乘,仅当两者都为True时结果为True.sum()对每列的布尔值求和,得到该列与Column C同时非空的行数
内容的提问来源于stack exchange,提问作者Teestaa Saha
相关产品推荐
相关产品推荐

