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

如何将列表值匹配到DataFrame中值为1的列索引

最佳实现:用Pandas的idxmax()快速解决

嘿,这个需求其实用Pandas内置的idxmax()方法就能轻松搞定,既简洁又高效,完全适配你这种“每行仅有一个1”的场景!

核心思路

因为每行只有一列值为1(其余都是0),idxmax(axis=1)会直接返回每行中值最大的列的索引(也就是那个值为1的列的位置),接着我们只需要把这个索引对应到你的参考列表prim_cols里的元素就行。

代码示例

先构造一个和你场景匹配的示例DataFrame:

import pandas as pd
import numpy as np

# 模拟你的0-1列数据,列索引是0、1、2...
df = pd.DataFrame({
    0: [1, 0, 0, 0],
    1: [0, 1, 0, 0],
    2: [0, 0, 1, 0],
    3: [0, 0, 0, 1]
})
prim_cols = ['a','b','c','d','e','f']

然后两步搞定新增列:

  1. 获取每行中值为1的列索引
  2. 映射到参考列表的对应元素
# 获取每行值为1的列索引
target_indices = df.idxmax(axis=1)
# 新增列,直接用索引取参考列表的元素
df['matched_value'] = prim_cols[target_indices]

运行后你的DataFrame会得到如下结果:

0123matched_value
1000a
0100b
0010c
0001d

处理特殊情况(可选)

如果你的数据里可能存在全0行(没有值为1的列),idxmax()会返回第一个列的索引,这时候可以用np.where过滤:

# 标记每行是否有1
has_one = df.sum(axis=1) == 1
# 对有1的行映射值,全0行设为NaN(或你想要的默认值)
df['matched_value'] = np.where(has_one, prim_cols[df.idxmax(axis=1)], np.nan)

为什么这是最佳方法?

  • 相比你尝试的列表推导、循环式np.where,idxmax()是Pandas原生优化的向量化操作,处理大数据量时速度快得多
  • 代码简洁直观,核心逻辑一目了然,可读性强

内容的提问来源于stack exchange,提问作者J.B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:41:30