#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