如何在Pandas中仅统计含rank前缀的列的非空值数量?
问题:统计Pandas DataFrame中指定前缀列的非空值数量
现有如下结构的Pandas DataFrame:
name domain rank1 rank2 rank3 ... rank_mean foo foo.com 1 1 2 ... 1.34 boo boo.it 5 12 ... 6.4 test test.eu 2 2 ... 2.6
其中name和domain列代表站点名称及网址,rank开头的列是站点在不同时间段的排名(如rank1对应2019年2月1日至28日,rank2对应2019年3月1日至31日),部分rank列存在空值(如test.eu在rank1时段未创建,boo.it在rank2后停用)。
需求是仅统计所有rank开头列(排除rank_mean)的非空值数量,使用df.count()会返回所有列的统计结果:
name 3 domain 3 rank1 2 rank2 3 rank3 2 ... rank_mean 3
但只需要如下结果:
rank1 2 rank2 3 rank3 2
尝试使用df.count(rank_list)(其中rank_list = ["rank1", "rank2", "rank3", ...])时,出现错误:unhashable type: 'list',求解决方法。
解决方法
错误原因
df.count()的参数并非列名列表,它的参数是axis(控制按行/列统计),直接传入列名列表会触发类型错误,正确思路是先筛选出目标列,再调用count()统计。
方法1:利用正则筛选目标列
如果要自动匹配所有rank开头且后跟数字的列(排除rank_mean),可以用filter(regex):
# 筛选列名以rank开头、后面跟数字的列 target_cols = df.filter(regex='^rank\d+$') # 统计非空值数量 result = target_cols.count() print(result)
方法2:使用预定义列名列表筛选
如果已经有明确的rank_list,直接通过列索引选择目标列后统计:
rank_list = ["rank1", "rank2", "rank3"] # 先选择指定列,再统计非空值 result = df[rank_list].count() print(result)
方法3:通过列名前缀筛选(排除rank_mean)
用列表推导式筛选符合条件的列名:
# 筛选以rank开头且不是rank_mean的列 target_cols = [col for col in df.columns if col.startswith('rank') and col != 'rank_mean'] result = df[target_cols].count() print(result)
内容的提问来源于stack exchange,提问作者gianluca gabriele
相关产品推荐
相关产品推荐

