Как я могу ранжировать группу строк фрейма данных на основе индекса?

#python #python-3.x #pandas

#python #python-3.x #панды

Вопрос:

У меня есть фрейм данных, который выглядит как:

df =

     a   b   c   d   e
0   1   1   0   1   1
1   0   0   0   1   1
2   0   0   0   0   0
3   1   1   1   0   0
4   0   0   0   0   0
5   1   1   1   1   1
  

Я хочу создать еще один столбец «ранг», который делит этот фрейм данных каждые 4 строки.

Результат, который я ищу

df =

     a   b   c   d   e result
0   1   1   0   1   1 0
1   0   0   0   1   1 0
2   0   0   0   0   0 0
3   1   1   1   0   0 0
4   0   0   0   0   0 1
5   1   1   1   1   1 1
.   .   .   .   .   . .
.   .   .   .   .   . .
  

То, что я делаю, это:

Я создал список и разделил этот список на группу из 6

 seq=[i for i in range(0,len(df))]
nn=[seq[i:i 4] for i in range(0,len(seq),4)]
  

затем я создал функцию, которая отображает значение

 def map(number):
    for i in range(0,len(df)):
        if number in nn[i]:
            return i
  

и использованная карта.

 df['rank']=df['index'].map(lambda x: map(x))
  

Есть ли лучший способ сделать то, что я пытаюсь сделать? Я уверен, что есть более эффективный способ сделать это? Я был бы признателен, если бы кто-нибудь мог помочь мне с этой проблемой.

Спасибо.

Ответ №1:

Как насчет:

 df['rank'] = df.reset_index().index // 4
  

Отредактируйте, чтобы отразить комментарий Пола: Если вы уверены, что ваш исходный индекс представляет собой последовательные целые числа, начинающиеся с 0, вы можете обойтись без reset_index() : df.index//4 .

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

1. почему reset_index ? df["rank"] = df.index // 4 работает

2. @pault На всякий случай, если исходный индекс не является последовательным, или не целочисленным, или кратным….

3. Достаточно справедливо. Я думаю, что стоит отредактировать этот пункт в вашем ответе.

Ответ №2:

Использовать np.repeat :

 result = np.repeat(range(4), 4)[:len(df)]
df['result'] = result

print(df)
   a  b  c  d  e  result
0  1  1  0  1  1       0
1  0  0  0  1  1       0
2  0  0  0  0  0       0
3  1  1  1  0  0       0
4  0  0  0  0  0       1
5  1  1  1  1  1       1