Python 从DataFrame获取单个值,如果不明确,则引发异常
对于我来说,这是一个相当常见的用例,我想从pandas数据帧中获得一个特定的值,知道如果数据没有被弄乱,那么应该只有一个值满足特定的选择标准: 我通常做的是: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[
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