如何从Pandas DataFrame中获取指定条件的单个值?
解决Pandas中获取符合条件的单个值问题
先还原一下你的DataFrame场景:
import pandas as pd A = pd.DataFrame({ 's': ['abc', 'def', 'abc'], 'S': ['a', 'b', 'b'], 'T': [12, 15, 1.4] })
你遇到的问题我完全get:想用at直接取符合条件的T值却报错,用loc得到的是Series对象,直接和其他数值比较时又触发了真值模糊的错误。下面给你几个实用的解决办法:
方法1:用loc配合.item()提取单个值
loc返回的Series虽然看起来只有一个值,但本质还是Series类型,直接拿来比较会让Pandas摸不清你的意图。用.item()方法可以把它转成纯粹的数值:
idx = (A['s'] == 'abc') & (A['S'] == 'b') number = A.loc[idx, 'T'].item()
这样number就是1.4这个浮点数了,之后和number2 = 1.3比较就不会报错啦。
方法2:用.iloc[0]取第一个元素
如果你确定符合条件的结果只有一行,也可以直接用.iloc[0]提取Series的第一个元素:
number = A.loc[idx, 'T'].iloc[0]
方法3:用query一步到位
要是你喜欢更简洁的写法,query方法能直接帮你筛选并提取目标值:
number = A.query("s == 'abc' and S == 'b'")['T'].item()
为什么之前的at会报错?
at是专门用来快速定位单个元素的工具,它要求你传入单个的行索引(整数或标签),但你传的idx是一个布尔数组(比如[False, False, True]),不符合at的索引规则,所以才会抛出ValueError。
为什么直接用loc的结果比较会报错?
A.loc[idx, 'T']返回的是Series对象,当你用它和number2比较时,Pandas不知道你是要比较整个Series还是单个元素,所以提示你用.empty、.bool()、.item()等方法明确意图,而.item()正好能把Series转成单个数值,完美解决这个问题。
内容的提问来源于stack exchange,提问作者user3605780
相关产品推荐
相关产品推荐

