Как получить максимальное количество последовательных столбцов со значениями выше нуля для каждой строки в векторизованнPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как получить максимальное количество последовательных столбцов со значениями выше нуля для каждой строки в векторизованн

Сообщение Anonymous »

В кадре данных с 12 столбцами и 4 миллионами строк мне нужно добавить столбец, который получит максимальное количество последовательных столбцов со значениями выше нуля для каждой строки.
Вот пример

Код: Выделить всё

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]
применил значение value_counts и преобразовал результат в фрейм данных,

Код: Выделить всё

pd.DataFrame(((df>0) != (df>0).shift(axis=1)).cumsum(axis=1).iloc[0].value_counts())
применил sort_values,

Код: Выделить всё

pd.DataFrame(((df>0) != (df>0).shift(axis=1)).cumsum(axis=1).iloc[0].value_counts()).sort_values('count', ascending=False)
и, наконец, получил первое значение (максимальное количество последовательных столбцов со значениями !=0 или == 0):

Код: Выделить всё

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.
Но давайте считать, что этот метод сработал, и теперь у нас есть количество последовательных столбцов со значениями !=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]
Но помните, что у нас 4 миллиона строк, поэтому выполнение этой итерации займет оооочень много времени, и это вторая проблема, с которой я столкнулся.

Подробнее здесь: https://stackoverflow.com/questions/785 ... e-zero-for
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»