Получение логического значения, если данные ниже порогового значения в панде - PullRequest
0 голосов
/ 08 июля 2019

У меня есть pandas multiindex dataframe со значениями напряжения и тока:

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

Я хочу преобразовать dataframe таким образом, чтобы я получил логическое значениезначение для каждой клавиши:

Для некоторого произвольного заданного напряжения и тока, скажем, 60 В и 10 А, я проверяю кадр данных на предмет ближайшего значения напряжения и проверяю, больше ли или меньше соответствующий ток, чем заданный.Для примера это должно выглядеть примерно так:

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

С некоторыми циклами for я запустил его, но есть ли хороший и эффективный способ сделать это с пандами, избегая циклов и другихитерационные подходы?

Ответы [ 2 ]

1 голос
/ 08 июля 2019

Вот мой подход с 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
0 голосов
/ 08 июля 2019

вы можете использовать pd.IndexSlice, чтобы отдельно выбрать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...