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

1

Dataframe

    a   b   c
0   0   1   1
1   0   1   1
2   0   0   1
3   0   0   1
4   1   1   0
5   1   1   1
6   1   1   1
7   0   0   1

Я пытаюсь применить cummulative count cumcount на нескольких столбцах данных, я попытался применить совокупный счет, группируя каждый столбец. Есть ли простой способ добиться ожидаемого результата

Я пробовал этот код, но он не работает

li =[]
for column in df.columns:
    li.append(df.groupby(column)[column].cumcount())
pd.concat(li,axis=1)

Ожидаемый результат

    a   b   c
0   1   1   1
1   1   2   2
2   1   1   3
3   1   1   4
4   1   1   1
5   2   2   1
6   3   3   2
7   1   1   3
  • 0
    Первый и последний столбец отличаются в выходных данных, вы можете объяснить больше?
  • 0
    да. Если в последовательности столбцов есть 0, отсчет 1 должен начинаться с первого. все нули должны быть заменены на 1, если назначено количество единиц. @jezrael
Показать ещё 1 комментарий
Теги:
pandas

1 ответ

4
Лучший ответ

Создавайте последовательные группы по сравнению со сдвинутыми значениями и для каждого столбца применяйте cumcount, последний набор 1 помощью булевой маски:

df = (df.ne(df.shift()).cumsum()
       .apply(lambda x: df.groupby(x).cumcount() + 1)
       .mask(df == 0, 1))
print (df)
   a  b  c
0  1  1  1
1  1  2  2
2  1  1  3
3  1  1  4
4  1  1  1
5  2  2  1
6  3  3  2
7  1  1  3

Другое решение, если производительность важна - подсчитывать только 1 значение и последний набор 1 по маске np.where:

a = df == 1
b = a.cumsum()
arr = np.where(a, b-b.mask(a).ffill().fillna(0).astype(int), 1)

df = pd.DataFrame(arr, index=df.index, columns=df.columns)
print (df)
   a  b  c
0  1  1  1
1  1  2  2
2  1  1  3
3  1  1  4
4  1  1  1
5  2  2  1
6  3  3  2
7  1  1  3
  • 1
    Спасибо за ваш ответ :-) @jezrael

Ещё вопросы

Сообщество Overcoder
Наверх
Меню