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

Pandas DataFrame如何查找每行首个值为1的位置并新增列

需求说明

现有如下Pandas数据集:

import pandas as pd
df = pd.DataFrame({
'id':['id1', 'id2', 'id3'],
 'cmp1':[1,0,0],
 'cmp2':[0,1,0],
  'cmp3':[1,0,0]})

需要新增col列,逐行标记cmp1/cmp2/cmp3三列中值为1首次出现的位置,规则如下:

  • 首个1出现在cmp1:标记为first
  • 首个1出现在cmp2:标记为second
  • 首个1出现在cmp3:标记为third
  • 三列无1:标记为none

期望输出效果:

df2 = pd.DataFrame({
'id':['id1', 'id2', 'id3'],
 'cmp1':[1,0,0],
 'cmp2':[0,1,0],
  'cmp3':[1,0,0],
  'col':['first', 'second','none']})
实现代码

直接用Pandas内置向量化方法实现,无需逐行循环,运行效率高:

# 指定要判断的列顺序
target_cols = ['cmp1', 'cmp2', 'cmp3']
# 列名到输出值的映射关系
label_map = {
    'cmp1': 'first',
    'cmp2': 'second',
    'cmp3': 'third'
}

# 计算col列
df['col'] = (
    df[target_cols]
    .idxmax(axis=1)  # 逐行返回最大值(即1)第一次出现的列名
    .map(label_map)  # 将列名替换为对应标记文本
    .where(df[target_cols].any(axis=1), 'none')  # 全0行填充为none
)
结果验证

执行代码后打印df,得到的输出和预期完全一致:

id  cmp1  cmp2  cmp3     col
0  id1     1     0     1   first
1  id2     0     1     0  second
2  id3     0     0     0    none

逻辑说明:idxmax(axis=1)本身会返回行内最大值首次出现的列索引,由于判断列的值只有0和1,最大值就是1,刚好匹配"找首个1位置"的需求;最后通过any(axis=1)判断行内是否存在1,过滤掉全0的特殊情况填充none即可。如果后续需要扩展更多判断列,只需要修改target_cols列表和对应label_map映射规则即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 03:03:39