Как применить кумулятивный подсчет для нескольких столбцов данных - PullRequest
0 голосов
/ 15 октября 2018

Фрейм данных

    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

Я пытаюсь применить кумулятивный счет 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

1 Ответ

0 голосов
/ 15 октября 2018

Создание последовательных групп путем сравнения со смещенными значениями и для каждого столбца применяется 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...