如何在DataFrame中统计每行pine树种总数量并生成新变量?
解决方案:统计每行中Pine树种的总数量
没问题,我来帮你搞定这个需求!你的DataFrame里每一组pX列对应spX列的树种数量,我们需要把每行里所有标记为pine的树种对应的数量加起来,生成新的pine列。
步骤1:明确数据结构
先把你的原始DataFrame整理成更清晰的表格格式:
| Join | p1 | sp1 | p2 | sp2 | p3 | sp3 |
|---|---|---|---|---|---|---|
| 1 | 0 | 0 | 0 | 0 | 0 | 0 |
| 2 | 1 | pine | 0 | 0 | 1 | Aspen |
| 3 | 2 | pine | 0 | 0 | 0 | 0 |
步骤2:实现统计逻辑
这里提供两种实用方法,你可以根据场景选择:
方法一:矢量化操作(推荐,大数据处理更高效)
利用pandas的矢量化特性,避免逐行循环,速度更快:
import pandas as pd # 假设你的DataFrame已创建,名为sp # 定义对应的数量列和树种列 p_cols = ['p1', 'p2', 'p3'] sp_cols = ['sp1', 'sp2', 'sp3'] # 生成布尔矩阵,标记哪些位置的树种是pine pine_mask = sp[sp_cols] == 'pine' # 把布尔值转成对应数量(True取对应p列的值,False取0),再每行求和 sp['pine'] = pine_mask.multiply(sp[p_cols]).sum(axis=1)
方法二:apply逐行处理
列数不多时,这种方式更直观易懂:
# 定义列对 p_cols = ['p1', 'p2', 'p3'] sp_cols = ['sp1', 'sp2', 'sp3'] # 对每行遍历列对,累加pine对应的数量 sp['pine'] = sp.apply( lambda row: sum(row[p_col] for p_col, sp_col in zip(p_cols, sp_cols) if row[sp_col] == 'pine'), axis=1 )
步骤3:查看最终结果
处理后你的DataFrame会新增pine列,结果如下:
| Join | p1 | sp1 | p2 | sp2 | p3 | sp3 | pine |
|---|---|---|---|---|---|---|---|
| 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 2 | 1 | pine | 0 | 0 | 1 | Aspen | 1 |
| 3 | 2 | pine | 0 | 0 | 0 | 0 | 2 |
补充提示
如果后续有更多pX/spX列(比如p4/sp4),只需要扩展p_cols和sp_cols的列表即可,代码不需要大改动~
内容的提问来源于stack exchange,提问作者Mostarin Binte Ahmed
相关产品推荐
相关产品推荐

