从 Pandas DataFrame 获取单个值,如果不明确则引发异常
Get single value from Pandas DataFrame, and raise Exception if ambiguous
这对我来说是一个相当常见的用例,我想从 pandas 数据框中获取特定值,知道,如果数据没有以某种方式弄乱,应该只有一个满足特定选择标准的值:
我经常做的是:
myvals = df[df['criterion']=='value']['parameterofinterest'].values
if len(myvals) != 1:
raise ValueError('Something messed up the data integrity.')
myvalue = myvals[0]
这是相当多的样板代码,作为 Pandas 的 之外的函数来实现似乎过于基础了。你知道是否已经有任何 Pandas 功能,这可以帮助我。
我认为可能有 3 种状态 - 无值 - 它 return len=0
,匹配更多值 - 它 return 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: Something messed up the data integrity.
df = pd.DataFrame({'parameterofinterest': [25.0, 38.0, 34.6],
'criterion': ['value', 'value', 'bb']})
print (scalar_only('criterion', 'value', 'parameterofinterest'))
ValueError: Something messed up the data integrity.
.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
这对我来说是一个相当常见的用例,我想从 pandas 数据框中获取特定值,知道,如果数据没有以某种方式弄乱,应该只有一个满足特定选择标准的值:
我经常做的是:
myvals = df[df['criterion']=='value']['parameterofinterest'].values
if len(myvals) != 1:
raise ValueError('Something messed up the data integrity.')
myvalue = myvals[0]
这是相当多的样板代码,作为 Pandas 的 之外的函数来实现似乎过于基础了。你知道是否已经有任何 Pandas 功能,这可以帮助我。
我认为可能有 3 种状态 - 无值 - 它 return len=0
,匹配更多值 - 它 return 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: Something messed up the data integrity.
df = pd.DataFrame({'parameterofinterest': [25.0, 38.0, 34.6],
'criterion': ['value', 'value', 'bb']})
print (scalar_only('criterion', 'value', 'parameterofinterest'))
ValueError: Something messed up the data integrity.
.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