#python #python-3.x #pandas #dataframe
Вопрос:
я пытаюсь повернуть строки фрейма данных, где первые строки-это последняя строка, вторая-первая и так далее
Оригинал
A | |
---|---|
0 | 1 |
1 | 2 |
2 | 3 |
3 | 4 |
4 | 5 |
5 | 6 |
Результат
A | |
---|---|
0 | 6 |
1 | 1 |
2 | 2 |
3 | 3 |
4 | 4 |
5 | 5 |
Как я могу это сделать?
Ответ №1:
Использовать np.roll
от numpy:
import numpy as np df['A'] = np.roll(df['A'], 1) print(df) # Output: A 0 6 1 1 2 2 3 3 4 4 5 5
Комментарии:
1. Я не знал о рулоне, он сохраняет тот же индекс? Дополнительный 1 из-за кого-то -1 для всех, лол
2. @Селиус Стингер. Numpy не заботится об индексе, поэтому значения правильно выровнены по столбцу. Спасибо за 1.
3. Вы правы, проблема, с которой я столкнулся в своем ответе, из-за которой мне пришлось сбросить значение_index (), была
iloc[]
. Спасибо за ваш ответ!4. np.roll лучше всего подходит для таких случаев. ДО 1 от меня
5. Может ли он использоваться с группой panda??
Ответ №2:
Я думаю, вам может понадобиться использовать np.arange()
с. iloc[]
Если вы хотите, чтобы индекс оставался неизменным, добавьте .reset_index()
:
df = pd.DataFrame({'A':[1,2,3,4,5,6]}) df.iloc[np.arange(-1, len(df)-1)].reset_index(drop=True)
ВОЗВРАТ:
A 0 6 1 1 2 2 3 3 4 4 5 5
Ответ №3:
Если вы ищете решение только для панд, это должно сделать работу за вас-
df = pd.concat([df.iloc[-1:], df.iloc[0:-1]]) df.reset_index(inplace=True, drop=True)
Комментарии:
1. Я не тот, кто проголосовал против, но ваше решение не работает. Это дает другой результат, чем ожидалось.
2. Для меня это прекрасно сработало. Не могли бы вы, пожалуйста, подробнее рассказать о том, чего вы хотели, чего не получилось таким образом? Я добавил строку сброса индекса, возможно, вы хотели, чтобы индексы были сброшены. Работает ли это сейчас?
3. Конечно, я могу. В вашем решении df.iloc[1:] дает нам элементы от 2 до 6, а df.iloc[0:1] дает 1. При использовании pd.concat мы получаем ряд: 2, 3, 4, 5, 6, 1. В ожидаемом объеме производства мы имеем: 6, 1, 2, 3, 4, 5. Если вы хотите создать его с помощью своего метода, вам следует сделать: pd.concat([df.iloc[-1:], df.iloc[:-1]]).reset_index(drop=True)
4. Вы абсолютно правы, я неправильно понял вопрос. Спасибо, я исправил это. Вы получили представление о подходе и в любом случае сами его разработали 😀