Создайте счетчик столбцов pandas, который последовательно подсчитывает 4 строки и 6 строк

#python #pandas #counter

Вопрос:

У меня есть фрейм данных pandas с несколькими столбцами, и я хочу создать счетчик, который последовательно подсчитывает 4 строки и 6 строк. Я бы хотел, чтобы это выглядело как кадр данных ниже:

Указатель счетчик
0 1
1 1
2 1
3 1
4 2
5 2
6 2
7 2
8 2
9 2
10 3
11 3
12 3
13 3

Как вы можете видеть, первые 4 значения в counter столбце равны 1, затем следующие 6 значений равны 2, затем снова следующие 4 значения равны 3.

Комментарии:

1. каковы определения 4 строк и 6 строк? ваш вопрос очень двусмыслен. все, что я вижу, это 4 строки со значением 1, за которыми следуют 6 строк со значением 2, за которыми следуют 4 строки со значением 3. Не знаю, как это связано с входным фреймом данных

2. Извините, я добавил столбец индекса, чтобы было понятнее. Например, если у меня есть фрейм данных, из индекса я хочу создать счетчик, который увеличивается на 1, когда он читает 4 строки, затем снова увеличивается на 1, когда он читает 6 строк, затем увеличивается на 1, когда он читает 4 строки (затем снова на 1 для 6 строк) и так далее до последней строки моего фрейма данных. Это понятнее?

Ответ №1:

Ваш вопрос немного ясен после редактирования, вы можете создать пустой список и переменную счетчика, затем выполнить итерацию по диапазону количества строк, увеличив его на 10, т. е. (4 6), затем на каждой итерации создавать требуемые списки длиной 4 и 6 со счетчиком и счетчиком 1, добавлять их в результирующий список. Наконец, возьмите срез из списка результатов сначала значения df.shape[0] (потому что у него может быть несколько больше значений, чем у df.shape[0]), и назначьте его новому столбцу df[‘счетчик’].

 result = []
counter = 1
for i in range(0, df.shape[0], 10):
    result  = [counter]*4
    counter  = 1
    result  = [counter]*6
    counter  = 1

df['counter'] = result[:df.shape[0]]
    
# result [1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4]
 

выход:

     index  counter
0       0        1
1       1        1
2       2        1
3       3        1
4       4        2
5       5        2
6       6        2
7       7        2
8       8        2
9       9        2
10     10        3
11     11        3
12     12        3
13     13        3