Вы можете использовать mask
с 2 логическими масками, объединенными в цепочку &
для поразрядной AND
:
print (df)
Week 1 week 2 week 3 week 4 week 5
Value 0 0 1 0 1
Value 0 1 2 0 1
df = df.mask(df.gt(1).cumsum(axis=1).eq(0) & df.eq(0), np.nan)
print (df)
Week 1 week 2 week 3 week 4 week 5
Value NaN NaN 1 NaN 1
Value NaN 1.0 2 0.0 1
Подробности :
Сравнить по gt
(>)
:
print (df.gt(1))
Week 1 week 2 week 3 week 4 week 5
Value False False False False False
Value False False True False False
Использовать cumsum
для проверки значений поиска до первого False
в строке:
print (df.gt(1).cumsum(axis=1))
Week 1 week 2 week 3 week 4 week 5
Value 0 0 0 0 0
Value 0 0 1 1 1
Сравнить по eq
(==)
:
print (df.gt(1).cumsum(axis=1).eq(0))
Week 1 week 2 week 3 week 4 week 5
Value True True True True True
Value True True False False False
Сравнить исходные данные:
print (df.eq(0))
Week 1 week 2 week 3 week 4 week 5
Value True True False True False
Value True False False True False
Цепочка вместе:
print (df.gt(1).cumsum(axis=1).eq(0) & df.eq(0))
Week 1 week 2 week 3 week 4 week 5
Value True True False True False
Value True False False False False