Условное количество значений во втором столбце

#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