从Pandas DataFrame中获取单个值,如果不明确则引发Exception

时间:2017-10-05 12:48:49

标签: python pandas dataframe key-value

对我来说这是一个相当常见的用例,我想从熊猫数据框中获取一个特定的值,知道如果数据没有被搞砸,那么应该只有一个值满足特定的选择标准:

我通常做的是:

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

这是一个样板代码,它似乎是一个非常基本的东西,可以作为Pandas的外部函数来实现。你知道是否已经有任何Pandas功能,这可以帮助我。

2 个答案:

答案 0 :(得分:3)

我认为可能有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()
df = pd.DataFrame({'parameterofinterest': [25.0, 38.0, 34.6], 
                  'criterion': ['value', 'aa', 'bb']})


print (scalar_only('criterion', 'value', 'parameterofinterest'))
25.0
df = pd.DataFrame({'parameterofinterest': [25.0, 38.0, 34.6], 
                  'criterion': ['dd', 'aa', 'bb']})


print (scalar_only('criterion', 'value', 'parameterofinterest'))
  

ValueError:有些东西搞砸了数据的完整性。

df = pd.DataFrame({'parameterofinterest': [25.0, 38.0, 34.6], 
                  'criterion': ['value', 'value', 'bb']})


print (scalar_only('criterion', 'value', 'parameterofinterest'))
  

ValueError:有些东西搞砸了数据的完整性。

答案 1 :(得分:0)

.item()是从a中提取单个值的正确方法  条件选择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