You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优雅统计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)

代码说明

  1. df.filter(regex='^sp'):通过正则筛选出所有物种列,避免手动列名索引;
  2. (sp_columns >= 2):生成布尔值矩阵,符合条件的位置为True;
  3. .sum(axis=1):按行求和,True会被视为1,直接得到每行符合条件的物种数量;
  4. 两种输出形式可根据需求选择,无需任何循环操作。

内容的提问来源于stack exchange,提问作者Arcturus Ranger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 20:40:19