#python #pandas #cumulative-sum
#python #панды #кумулятивная сумма #running-count
Вопрос:
Я хочу заполнить числа в столбце flag
на основе значения в столбце KEY
.
- Вместо того, чтобы использовать
cumcount()
для заполнения инкрементных чисел, я хочу заполнить одно и то же число для каждых двух строк, если значение в столбцеKEY
остается неизменным. - Если значение в столбце
KEY
изменяется, заполненное число также изменяется.
Вот пример, df1 — это то, что я хочу от df0.
df0 = pd.DataFrame({'KEY':['0','0','0','0','1','1','1','2','2','2','2','2','3','3','3','3','3','3','4','5','6']})
df1 = pd.DataFrame({'KEY':['0','0','0','0','1','1','1','2','2','2','2','2','3','3','3','3','3','3','4','5','6'],
'flag':['0','0','1','1','2','2','3','4','4','5','5','6','7','7','8','8','9','9','10','11','12']})
Комментарии:
1. Я отредактировал ваш заголовок, чтобы он был более понятным, вы можете отредактировать, если хотите. Кроме того, не называйте вещи «python», когда вы действительно имеете в виду «pandas»; только 12% вопросов SO python касаются pandas.
2. Во-первых, все ваши значения являются целыми числами, а не строками, поэтому вы можете отредактировать свой код, чтобы присвоить / преобразовать их в целые числа? (или использовать
df1.apply(pd.to_numeric, axis=1)
)3. Далее, не могли бы вы отредактировать свое объяснение, чтобы уточнить его на словах? Это слишком зависит от данных
flag
иKEY
; должны ли мы всегда предполагатьKEY
, что монотонно увеличивается и изменяется только на 1? Похоже, вам нужно условиеcumcount()
для последовательных двухстрочных фрагментовKEY
, по умолчаниюflag
также увеличивает 1 каждые две строки, с дополнительным 1 приKEY
увеличении?4. @smci, спасибо за ваши комментарии. Мой пример здесь представляет собой представление моего реального набора данных. КЛЮЧЕВОЙ столбец создается с помощью df[‘KEY’] = df.groupby([несколько столбцов объектов]).ngroup(). Цель состоит в том, чтобы разделить строки на группы по функциям. Затем в каждой группе я пытаюсь создать пары строк.
5. @Дэвид Эриксон, спасибо за ваш ответ. Это работает так, как я хочу. Я делаю правильные вещи.
Ответ №1:
Вы хотите получить общее количество и добавить его. Затем используйте %2
для различения четных или нечетных строк. Затем возьмите совокупную сумму и вычтите 1, чтобы начать отсчет с нуля.
Вы можете использовать:
df0['flag'] = ((df0.groupby('KEY').cumcount() 1) % 2).cumsum() - 1
df0
Out[1]:
KEY flag
0 0 0
1 0 0
2 0 1
3 0 1
4 1 2
5 1 2
6 1 3
7 2 4
8 2 4
9 2 5
10 2 5
11 2 6
12 3 7
13 3 7
14 3 8
15 3 8
16 3 9
17 3 9
18 4 10
19 5 11
20 6 12