Как сдвиг столбца в панды фрейма данных


Я хотел бы переместить столбец в панд DataFrame, но я не смог найти способ сделать это из документации без переписывания всего DF. Кто-нибудь знает как это сделать? Фрейм данных:

##    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
4 64

4 ответа:

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,... В конце фрейма данных (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) как уже было опубликовано однако бы что отрезать перенос.