диапазон значений маски по столбцам только в том случае, если это происходит k-раз

#python #pandas

Вопрос:

У меня есть df с 4 столбцами, и если в каждом столбце два значения от 1 до 8, значение должно быть изменено на 500, а все остальные значения должны оставаться прежними

 df = pd.DataFrame(data={'a':[0,9,12,10,11],
                        'b': [1,8,90,2,0],
                        'c': [0,5,3,10,18],
                        'd': [15,43,90,14,87]})
 

Здесь только в третьем столбце должны быть заменены значения (1 и 2), так как в нем два значения от 1 до 8. Принимая во внимание, что в столбцах a и d нет ни одного вхождения, а в столбце 2 три вхождения (1,2,8). Я могу создать маску для применения ко всем экземплярам, но я не могу настроить ее так, чтобы она ограничивала количество вхождений. любые предложения приветствуются, спасибо

 # convert zeros to nan
df.replace(0, np.nan, inplace=True)
mask1 = df.lt(9)
df.mask(mask1, 500)
 

Ответ №1:

Попробуйте с этим:

 >>> df[(df.ge(1) amp; df.le(8) amp; (df.ge(1) amp; df.le(8)).sum().eq(2))] = 500
>>> df
    a   b    c   d
0   0   1    0  15
1   9   8  500  43
2  12  90  500  90
3  10   2   10  14
4  11   0   18  87
>>> 
 

Или лучше назначить в качестве переменной:

 >>> conds = df.ge(1) amp; df.le(8)
>>> df[conds amp; conds.sum().eq(2)] = 500
>>> df
    a   b    c   d
0   0   1    0  15
1   9   8  500  43
2  12  90  500  90
3  10   2   10  14
4  11   0   18  87
>>>