Ответ 1
In [18]: a
Out[18]:
x1 x2
0 0 5
1 1 6
2 2 7
3 3 8
4 4 9
In [19]: a.x2 = a.x2.shift(1)
In [20]: a
Out[20]:
x1 x2
0 0 NaN
1 1 5
2 2 6
3 3 7
4 4 8
Я хотел бы сместить столбец в Pandas DataFrame
, но мне не удалось найти способ сделать это из документации без перезаписи всего DF. Кто-нибудь знает как это делать?
DataFrame:
## x1 x2
##0 206 214
##1 226 234
##2 245 253
##3 265 272
##4 283 291
Требуемый вывод:
## x1 x2
##0 206 nan
##1 226 214
##2 245 234
##3 265 253
##4 283 272
##5 nan 291
In [18]: a
Out[18]:
x1 x2
0 0 5
1 1 6
2 2 7
3 3 8
4 4 9
In [19]: a.x2 = a.x2.shift(1)
In [20]: a
Out[20]:
x1 x2
0 0 NaN
1 1 5
2 2 6
3 3 7
4 4 8
Если вы не хотите потерять столбцы, вы переместитесь в прошлое в конец вашего фрейма данных, просто добавьте требуемый номер первым:
offset = 5
DF = DF.append([np.nan for x in range(offset)])
DF = DF.shift(periods=offset)
DF = DF.reset_index() #Only works if sequential index
Я полагаю, что импорт
import pandas as pd
import numpy as np
Сначала добавьте новую строку с NaN, NaN,...
в конец DataFrame (df
).
s1 = df.iloc[0] # copy 1st row to a new Series s1
s1[:] = np.NaN # set all values to NaN
df2 = df.append(s1, ignore_index=True) # add s1 to the end of df
Он создаст новый DF df2. Возможно, есть более элегантный способ, но это работает.
Теперь вы можете переместить его:
df2.x2 = df2.x2.shift(1) # shift what you want
Давайте определим фрейм данных из вашего примера
>>> df = pd.DataFrame([[206, 214], [226, 234], [245, 253], [265, 272], [283, 291]],
columns=[1, 2])
>>> df
1 2
0 206 214
1 226 234
2 245 253
3 265 272
4 283 291
Тогда вы можете манипулировать индексом второго столбца с помощью
>>> df[2].index = df[2].index+1
и, наконец, повторно объединить отдельные столбцы
>>> pd.concat([df[1], df[2]], axis=1)
1 2
0 206.0 NaN
1 226.0 214.0
2 245.0 234.0
3 265.0 253.0
4 283.0 272.0
5 NaN 291.0
Возможно, не быстро, но просто для чтения. Рассмотрите возможность установки переменных для имен столбцов и фактического требуемого сдвига.
Редактировать: Как правило, сдвиг возможен с помощью df[2].shift(1)
как это уже было опубликовано, однако это приведет к отсечке переноса.
Вам нужно использовать df.shift здесь
df.shift(i) сдвигает весь фрейм данных на я единицы вниз.
Так что для я = 1
Входные данные:
x1 x2
0 206 214
1 226 234
2 245 253
3 265 272
4 283 291
Выход:
x1 x2
0 Nan Nan
1 206 214
2 226 234
3 245 253
4 265 272
Так что запустите этот скрипт, чтобы получить ожидаемый результат
import pandas as pd
df = pd.DataFrame({'x1': ['206', '226', '245',' 265', '283'],
'x2': ['214', '234', '253', '272', '291']})
print(df)
df['x2'] = df['x2'].shift(1)
print(df)
Пытаясь ответить на личную проблему, похожую на вашу, я нашел в Pandas Doc то, что, по-моему, ответило бы на этот вопрос:
DataFrame.shift (period= 1, freq = None, axis = 0) Сдвиг индекса на желаемое количество периодов с необязательной временной частотой
Заметки
Если задано значение freq, то значения индекса сдвигаются, но данные не выравниваются. То есть используйте freq, если вы хотите расширить индекс при сдвиге и сохранить исходные данные.
Надеюсь помочь будущим вопросам в этом вопросе.
Вот как я это делаю:
df_ext = pd.DataFrame(index=pd.date_range(df.index[-1], periods=8, closed='right'))
df2 = pd.concat([df, df_ext], axis=0, sort=True)
df2["forecast"] = df2["some column"].shift(7)
В основном я генерирую пустой фрейм данных с нужным индексом, а затем просто объединяю их вместе. Но я действительно хотел бы видеть это как стандартную функцию в пандах, поэтому я предложил усовершенствование пандам.