Python 如果数据低于dataframe中的树型,则获取布尔值

Python 如果数据低于dataframe中的树型,则获取布尔值,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个带有电压和电流值的多索引数据帧: 数据帧: a b 'name' unit 0 1 2 3 ... 1 1 absd A 0 1.1 3.6 7.6 V 6 66 103 202 2 quat A 1 2.5 14.9 nan V 0 3 66 nan 我希望转换数据帧,以便为每个键获得布尔值: 对于一些任意给定的电压和电流,比如60V和10A,我检查

我有一个带有电压和电流值的多索引数据帧:

数据帧:

a b 'name' unit
             0    1    2    3   ... 
1 1  absd A  0  1.1  3.6  7.6
          V  6   66  103  202
  2  quat A  1  2.5 14.9  nan
          V  0    3   66  nan
我希望转换数据帧,以便为每个键获得布尔值:

对于一些任意给定的电压和电流,比如60V和10A,我检查数据帧中最近的电压值,然后检查相应的电流是否大于或小于给定的值。 例如,最后应该是这样的:

a b 'name'
1 1  absd  0          
  2  quat  1

对于一些for循环,我让它运行起来,但是有没有一种好的、有效的方法来避免pandas、for循环和其他迭代方法呢?

下面是我使用
groupby
idxmin
的方法:

df = df.stack().unstack('unit')

# function for each v and a
def get_thresh(df, v, a):
    v_diff = (df['V'] - v).abs()
    idx = v_diff.groupby(['a','b','name']).idxmin()

    return (df.loc[idx,'A']
              .gt(a).astype(int)
              .reset_index(level=-1, drop=True)
           )

get_thresh(df, 60,10)
返回:

a  b  name   
1  1  absd    0
   2  quat    1
Name: A, dtype: int32
您可以使用分别选择数据帧的V和A,然后创建布尔掩码以查看A的值是否大于10,V的值是否最接近60

amp_min = 10
volt_value = 60

# mask for A
mask_A = (df.loc[pd.IndexSlice[:,:,:, 'A'], :] > amp_min).reset_index(level=-1, drop=True)

#mask for V by finding the column position of the minimum difference
mask_V = pd.get_dummies((df.loc[pd.IndexSlice[:,:,:, 'V'], :] - volt_value)
                           .abs().idxmin(axis=1)).reset_index(level=-1, drop=True)

#combine both mask and use any per row
print ((mask_A & mask_V).any(1).astype(int))
a  b  name
1  1  absd    0
   2  quat    1
dtype: int32

你刚才说的
60V
10A
电流在哪里?它们是固定的还是应该在数据框中查找?不,值不是固定的。它们是由一些用户提供的。在示例数据框中,最接近的值为66V,因此我们将相应的当前值1.1A和14.9A分别与给定的10V进行比较,但从何处获得值
60V
10A
?不是从数据框中获得的。我需要知道数百次测量,在任意电压下,电流是否高于某个阈值或低于某个阈值。