Python 从DataFrame获取单个值,如果不明确,则引发异常

Python 从DataFrame获取单个值,如果不明确,则引发异常,python,pandas,dataframe,key-value,Python,Pandas,Dataframe,Key Value,对于我来说,这是一个相当常见的用例,我想从pandas数据帧中获得一个特定的值,知道如果数据没有被弄乱,那么应该只有一个值满足特定的选择标准: 我通常做的是: myvals = df[df['criterion']=='value']['parameterofinterest'].values if len(myvals) != 1: raise ValueError('Something messed up the data integrity.') myvalue = myvals[

对于我来说,这是一个相当常见的用例,我想从pandas数据帧中获得一个特定的值,知道如果数据没有被弄乱,那么应该只有一个值满足特定的选择标准:

我通常做的是:

myvals = df[df['criterion']=='value']['parameterofinterest'].values
if len(myvals) != 1:
    raise ValueError('Something messed up the data integrity.')
myvalue = myvals[0]

这是一个相当多的样板代码,它似乎是一个非常基本的东西,在Pandas之外作为一个函数实现。你知道有没有熊猫函数可以帮我解决这个问题。

我认为可能有3种状态-无值-它返回
len=0
,匹配更多值-它返回
len>1
和标量
len==1

因此,您的代码似乎是正确的,只有一点改进:

myvals = df.loc[df['criterion']=='value', 'parameterofinterest']

if len(myvals) == 1:
    myvals = myvals.item()        
else:
   raise ValueError('Something messed up the data integrity.')
可以将其包装以实现以下功能:

def scalar_only(mask_col, val, another_col):
    myvals = df.loc[df[mask_col]==val, another_col]

    if len(myvals) != 1:
        raise ValueError('Something messed up the data integrity.')
    else:
        return myvals.item()

ValueError:数据完整性被破坏

ValueError:数据完整性被破坏

.item()
是从数据中提取单个值的正确方法 有条件选择
pd.DataFrame
对象-如果存在多个项,则引发异常

import pandas as pd
a = [{'a':3, 'b':4},{'a':2, 'b':4}]
c = pd.DataFrame(a)
c[c['b']==4]['a'].values
c[c['b']==4]['a'].item()
当前引发的异常是:

ValueError: can only convert an array of size 1 to a Python scalar

可用于再现相同错误的样本数据?它可以是任何类型的数据,
预计在
标准
列上只出现一次。您能对所有值进行初步检查吗?类似于
(df['criteria'].value\u counts()==1)。all()
?谢谢。为什么你的版本会有所改进?(为什么要使用
.loc
以及为什么要使用
.item()
而不是
.values[0]
?以及为什么要在raise将终止代码时使用if/else?)我使用
loc
,因为它速度更快,更值得推荐
.values[0]
item()
.Hmmm的替代品,所以我的答案没有帮助?它很有帮助,因为它显示了一种稍微不同的方式(正如您所说,可能更快)来表达我的样板代码。我更感兴趣的是熊猫是否提供了更全面的功能。这似乎是一个相当常见的用例。@Chymera初始查询应该使用loc执行,以便将对getitem的调用从2减少到1。这就是耶斯雷尔所展示的。您的用例还没有封装到单个api调用中,但是有很多方法可以做到这一点。这就是说,这是你将要找到的最简洁的。你可能一直希望有更好的解决方案,但目前没有。这是你的答案。
df = pd.DataFrame({'parameterofinterest': [25.0, 38.0, 34.6], 
                  'criterion': ['value', 'value', 'bb']})


print (scalar_only('criterion', 'value', 'parameterofinterest'))
import pandas as pd
a = [{'a':3, 'b':4},{'a':2, 'b':4}]
c = pd.DataFrame(a)
c[c['b']==4]['a'].values
c[c['b']==4]['a'].item()
ValueError: can only convert an array of size 1 to a Python scalar