#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
>>>