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

如何获取DataFrame指定列中含特定值的行号?

获取DataFrame列中列表值对应的行号

需求

获取指定列中包含特定列表值的行号,已知该值在列中唯一存在。

尝试代码

import pandas as pd
pos = pd.DataFrame(columns=['id', 'pred'])
pos.loc[1,'id'] = [4, 4, 4]
pos.loc[2,'id'] = [2, 3, 3]
pos.loc[3,'id'] = [1, 1, 2]
pos.loc[4,'id'] = [1, 2, 1]

print(pos)

print(pos[pos['id'] == [1, 1, 2]].index[0])

报错信息

ValueError: ('Lengths must match to compare', (6,), (3,))
中文翻译:值错误:比较时长度必须匹配,当前参与对比的长度为(6,)和(3,)

问题原因

直接用==对比DataFrame列和列表时,pandas会错误地将列中所有列表元素展开成一维序列,再与目标列表做逐元素匹配,导致两者长度不匹配,触发报错。

解决方案

要匹配列中存储的完整列表值,需逐行检查每个元素是否等于目标列表,推荐用apply方法实现:

import pandas as pd
pos = pd.DataFrame(columns=['id', 'pred'])
pos.loc[1,'id'] = [4, 4, 4]
pos.loc[2,'id'] = [2, 3, 3]
pos.loc[3,'id'] = [1, 1, 2]
pos.loc[4,'id'] = [1, 2, 1]

target_list = [1, 1, 2]
# 逐行判断列中的列表是否等于目标列表
matched_index = pos[pos['id'].apply(lambda x: x == target_list)].index[0]
print(matched_index)

运行后会输出目标值所在的行号3。

也可以用eq结合all的方式实现:

matched_index = pos[pos['id'].apply(lambda x: pd.Series(x).eq(target_list).all())].index[0]

这种方式将每个列表转为Series,逐元素对比后判断是否全部匹配,结果与前一种方法一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 03:48:13