Как сдвинуть столбец в 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

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, если вы хотите расширить индекс при сдвиге и сохранить исходные данные.

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


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)

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.