Вот пример
Код: Выделить всё
df = pd.DataFrame(np.array([[284.77, 234.37, 243.8, 84.36, 0., 0., 0., 55.04, 228.2, 181.97, 0., 0.],
[13.78, 0., 38.58, 33.16, 0., 38.04, 74.02, 45.74, 27.2, 9.19, 0., 0.],
[88.66, 255.72, 323.19, 7.24, 0., 73.38, 45.73, 0., 0., 77.39, 26.57, 279.34],
[0., 0., 34.42, 9.16, 0., 43.4, 42.17, 123.69, 60.5, 25.47, 72.32, 7.29],
[320.6, 1445.56, 856.23, 371.21, 0., 244.22, 134.58, 631.59, 561.82, 1172.44, 895.68, 186.28],
[0., 0., 32.29, 1000.91, 0., 680., 585.46, 466.6, 0., 493.48, 157.1, 125.31]]),
columns=[1,2,3,4,5,6,7,8,9,10,11,12])
Код: Выделить всё
df['MAX_CONSECUTIVE_COL'] = pd.Series([4,5,4,7,7,3])
Я пытался замаскировать данные с помощью логических значений и выполнить накопительную сумму, чтобы идентифицировать каждую группу последовательных столбцов со значениями == 0 или != 0
Код: Выделить всё
((df\>0) != (df\>0).shift(axis=1)).cumsum(axis=1)
Код: Выделить всё
((df>0) != (df>0).shift(axis=1)).cumsum(axis=1).iloc[0]
Код: Выделить всё
pd.DataFrame(((df>0) != (df>0).shift(axis=1)).cumsum(axis=1).iloc[0].value_counts())
Код: Выделить всё
pd.DataFrame(((df>0) != (df>0).shift(axis=1)).cumsum(axis=1).iloc[0].value_counts()).sort_values('count', ascending=False)
Код: Выделить всё
pd.DataFrame(((df>0) != (df>0).shift(axis=1)).cumsum(axis=1).iloc[0].value_counts()).sort_values('count', ascending=False).iloc[0,0]
Но давайте считать, что этот метод сработал, и теперь у нас есть количество последовательных столбцов со значениями !=0 для первой строки. Единственное решение, которое я смог разработать для получения результатов для других строк, — это итерация каждой из них. Примерно так:
Код: Выделить всё
df['MAX_CONSECUTIVE_COL'] = 0
for n in range(0,df.shape[0]-1):
df.loc[df.index[n], 'MAX_CONSECUTIVE_COL'] = pd.DataFrame(((df>0) != df>0).shift(axis=1)).cumsum(axis=1).iloc[n].value_counts()).sort_values('count',ascending=False).iloc[0,0]
Подробнее здесь: https://stackoverflow.com/questions/785 ... e-zero-for