如何优雅统计DataFrame中各站点数值≥2的物种数量
高效统计DataFrame各站点符合条件的物种数量
问题背景
现有如下结构的DataFrame(site为站点ID,elevation为海拔,sp*为各物种的数值):
site elevation sp1 sp2 sp3 sp4 sp5 sp6 sp7 sp8 sp9 sp10 sp11 sp12 sp13 sp14 sp15 sp16 sp17 sp18 1 1.2 0 5 2 1 2 0 1 0 2 0 1 3 0 0 0 0 0 0 2 3.9 0 4 2 0 3 0 0 0 0 2 0 2 0 0 1 0 0 0 3 4.4 0 2 1 1 2 0 1 0 0 1 0 3 0 0 0 0 0 0 4 5.5 0 4 3 0 5 0 1 0 2 1 0 3 0 0 2 0 0 0 5 9.0 0 3 2 0 1 0 1 0 2 0 0 1 0 0 0 1 0 0
需求:针对每个站点,统计数值≥2的物种数量,期望结果为类似[6,6,4,7,4]的列表,或包含siteID与对应统计值的数组。当前使用嵌套循环实现,希望找到更优雅高效的方案。
解决方案
利用Pandas的向量化运算替代嵌套循环,代码简洁且效率更高:
import pandas as pd # 假设已读取数据到df中 # 筛选所有以sp开头的物种列 sp_columns = df.filter(regex='^sp') # 按行统计数值≥2的物种数量 qualified_counts = (sp_columns >= 2).sum(axis=1) # 方案1:获取纯统计值列表 count_list = qualified_counts.tolist() # 结果为 [6,6,4,7,4] # 方案2:获取包含siteID的结果数组 result_df = df[['site']].assign(qualified_sp_count=qualified_counts)
代码说明
df.filter(regex='^sp'):通过正则筛选出所有物种列,避免手动列名索引;(sp_columns >= 2):生成布尔值矩阵,符合条件的位置为True;.sum(axis=1):按行求和,True会被视为1,直接得到每行符合条件的物种数量;- 两种输出形式可根据需求选择,无需任何循环操作。
内容的提问来源于stack exchange,提问作者Arcturus Ranger
相关产品推荐
相关产品推荐

