如何用Pandas统计每行指定前缀列的非NaN值数量
解决方法:统计指定前缀列的每行非NaN值数量
你已经正确筛选出了前缀为number的列,接下来用pandas内置的count()方法就能快速统计每行的非缺失值数量,无需复杂的lambda操作。
完整代码实现
import pandas as pd import numpy as np # 构造示例数据集 data = { 'id': [1, 2, 3], 'something': [105, 300, 20], 'number1': [200, 2, 1], 'number2': [np.nan, 1, np.nan], 'number3': [np.nan, 1, np.nan], 'number4': [50, 33, np.nan] } df = pd.DataFrame(data) # 1. 筛选前缀为number的列(两种写法可选) number_cols = df.columns[df.columns.str.startswith('number')] # 更简洁的正则筛选写法:number_cols = df.filter(regex='^number').columns # 2. 统计每行非NaN值的数量并生成新列 df['sum_columns'] = df[number_cols].count(axis=1) print(df)
代码说明
df[number_cols].count(axis=1):count()方法默认自动忽略NaN值,axis=1参数指定按行统计,直接返回每行的非缺失值数量,这是效率最高的实现方式。- 如果你想用lambda实现,也可以这么写(效率略低于
count()):df['sum_columns'] = df[number_cols].apply(lambda row: row.notna().sum(), axis=1)
输出结果
| id | something | number1 | number2 | number3 | number4 | sum_columns |
|---|---|---|---|---|---|---|
| 1 | 105 | 200 | NaN | NaN | 50 | 2 |
| 2 | 300 | 2 | 1 | 1 | 33 | 4 |
| 3 | 20 | 1 | NaN | NaN | NaN | 1 |
内容的提问来源于stack exchange,提问作者Lurri
相关产品推荐
相关产品推荐

