如何用Pandas高效统计每行指定列的非空字符串单元格数量?
高效统计指定列中非空字符串单元格数量的方案
嘿,我太懂处理大型数据集时卡得要死的感受了!针对你要统计每行中标签1到65的列里非空字符串单元格数量的需求,我给你几个高效到飞起的方案,全是利用pandas的向量化操作——这可是大数据处理的核心buff,比逐行循环快几个数量级:
基础版:用
count()快速计数(适用于空值为NaN的场景)
先筛选出1到65的目标列,然后直接调用count()按行统计,它会自动忽略NaN值:import pandas as pd # 假设你的数据集存在变量df中 # 生成1-65的列名(如果列名是数字类型就去掉str()转换) target_cols = [str(i) for i in range(1, 66)] # 新增列存储每行的计数结果 df['string_cell_count'] = df[target_cols].count(axis=1)这个方法底层是C实现的向量化运算,完全避开了Python循环的低效问题,百万级行数据也能秒出结果。
进阶版:处理空字符串的场景
如果你的“空单元格”是指空字符串""而非NaN,那可以先把空字符串转成NaN再用count(),或者直接用布尔判断求和:# 方案1:替换空字符串为NaN后计数 df[target_cols] = df[target_cols].replace("", pd.NA) df['string_cell_count'] = df[target_cols].count(axis=1) # 方案2:布尔矩阵直接求和(更直观) df['string_cell_count'] = (df[target_cols] != "").sum(axis=1)后者生成的布尔矩阵会把非空字符串标记为
True,sum(axis=1)直接对每行的True计数,效率同样拉满。严格版:仅统计字符串类型的单元格
如果目标列里混合了数字、字符串等多种类型,你只想统计真正是字符串且非空的单元格,可以用applymap批量判断类型:def is_valid_string(val): # 判断是字符串类型且不为空(strip()可过滤纯空格的情况) return isinstance(val, str) and val.strip() != "" # 生成布尔矩阵后按行求和 df['string_cell_count'] = df[target_cols].applymap(is_valid_string).sum(axis=1)这个方法比前两个稍慢,但还是远胜逐行循环,适合类型复杂的数据集。
超大型数据集专属:用Dask分块处理
如果你的数据大到内存装不下,试试dask.dataframe,它会自动分块加载处理,用法和pandas几乎一致:import dask.dataframe as dd # 分块加载数据集(支持csv、parquet等多种格式) ddf = dd.read_csv("your_huge_dataset.csv") target_cols = [str(i) for i in range(1, 66)] ddf['string_cell_count'] = ddf[target_cols].count(axis=1) # 计算并转回pandas dataframe(按需选择) result_df = ddf.compute()
这些方案都彻底抛弃了低效的逐行遍历,充分利用了批量运算的优势,处理大型数据时速度提升会非常明显,你可以根据自己数据的实际情况挑对应的来用~
内容的提问来源于stack exchange,提问作者Anant
相关产品推荐
相关产品推荐

