Как сдвинуть столбец в Pandas DataFrame

101

Я хотел бы переместить столбец в пандах 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
корень
источник
3
это действительно должен быть необязательный флаг для функции сдвига
KIC

Ответы:

156
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
Eumiro
источник
9
В результате отсутствует ## 5. Есть ли в пандах простой способ расширить индекс при использовании сдвига?
Уэйлон Уокер
@WaylonWalker Это называется df['x2'] = np.roll(df['x2'], 1)
ayhan
1
Кто-нибудь понял это? # 5 все еще отсутствует
Kritz
Мне нужно таким же образом сместить 100 столбцов, как я могу сделать цикл for?
Винсент Рой
2
@Johan вы пробовали добавить пустую строку в конце, прежде чем сдвинуть ее?
MikeyE
8

Вам нужно использовать df.shiftздесь.
df.shift(i)сдвигает весь фрейм данных на iединицы вниз.

Итак, для 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)
Аюш Джайн
источник
3
Добро пожаловать в stackoverflow. Ваш ответ будет более полезным, если вы объясните, как его следует использовать.
Simon.SA
1
снова вы потеряли одну строку №5, которую OP явно хочет
KIC
6

Давайте определим фреймворк из вашего примера с помощью

>>> 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)как уже было опубликовано, однако это отключит переход.

Кей Виттиг
источник
Интересно, есть ли быстрый способ сделать это, и, используя индекс даты, по сути, вы хотите сдвинуть, не усекая нашу серию, и поэтому вы должны указать дополнительные значения индекса. для сдвига на единицу вы бы сказали что-то вроде series.shift (-1, fill = [datetime (<some date>)]). Возможно ли что-то подобное? Я нашел это здесь stackoverflow.com/questions/36042804/…
OldSchool
5

Если вы не хотите терять столбцы, которые вы перемещаете за конец фрейма данных, просто сначала добавьте требуемый номер:

    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
Дэвид Феррис
источник
3

Я полагаю импорт

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
Мартин-Вой
источник
2

Пытаясь ответить на личную проблему, похожую на вашу, я нашел в Pandas Doc то, что, как мне кажется, могло бы ответить на этот вопрос:

DataFrame.shift ( period = 1, freq = None, axis = 0) Сдвинуть индекс на желаемое количество периодов с необязательной временной частотой

Ноты

Если указано freq, значения индекса сдвигаются, но данные не выравниваются заново. То есть используйте freq, если вы хотите расширить индекс при сдвиге и сохранить исходные данные.

Надеюсь помочь в будущем в вопросах в этом вопросе.

Tha_franklin
источник
0

Вот как я это делаю:

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)

В основном я создаю пустой фрейм данных с желаемым индексом, а затем просто объединяю их вместе. Но я действительно хотел бы видеть это как стандартную функцию в пандах, поэтому я предложил улучшение для пандов.

KIC
источник